Ответы с форумов MSDN

Добавление надписи на изображение в C#

Date: 17.06.2019 6:50:58

У вас идет рисование на PictureBox. Чтобы обрабатывать файлы без отображения, нужно как-то отделить обработку от GUI, т.е. реализовать рисование на самом объекте Image.

Вынесите добавление надписи в отдельный метод:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;

namespace WindowsFormsApp1
{
    public static class ImageEditor
    {
        public static void AddText(Image img, string text, Font font, Brush br, Point position)
        {
            Graphics g = Graphics.FromImage(img);

            using (g)
            {
                g.DrawString(text, font, br, position);
            }
        }
    }
}

Тогда добавление ее на все файлы в каталоге можно реализовать так:

using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();            
        }

        void ProcessDirectory(string dir,string pattern,string text)
        {
            string[] files = Directory.GetFiles(dir,pattern);            

            //обрабатываем файлы в каталоге
            for (int i = 0; i < files.Length; i++)
            {                
                var bmp = new Bitmap(files[i]); //загрузка изображения                                
                Bitmap copy = new Bitmap(bmp); //создаем копию для обработки
                bmp.Dispose(); //освобождаем файл

                using (copy)
                {
                    //добавляем надпись
                    ImageEditor.AddText(copy, text, SystemFonts.CaptionFont, Brushes.Black, new Point(0, 0));

                    //сохраняем файл
                    copy.Save(files[i]);
                }
            }

            string[] dirs = Directory.GetDirectories(dir);

            //обрабатываем подкаталоги
            for (int i = 0; i < dirs.Length; i++)
            {
                ProcessDirectory(dirs[i],pattern,text);
            }
        }        

        private async void button1_Click(object sender, EventArgs e)
        {            
            string text = textBox1.Text;
            await Task.Run(() => { ProcessDirectory("c:\\test\\images", "*.png",text); });
            MessageBox.Show("Completed!");
        }      
    }  
}


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub