none
ПРОЕКТЫ С GUI C# RRS feed

  • Вопрос

  • Всем привет! вот задание: "Создать приложение, которое позволяет добавлять указанному изображению 
    заданную надпись (шрифт, размер, цвет, координаты указывает 
    пользователь). Добавить возможность автоматического добавления надписи 
    ко всем изображениям заданного формата в выбранной директории (с учетом 
    вложенных папок)
    ." я сделал половину, а вот что выделено шрифтом, никак не получается, если есть у кого-то идеи буду рад выслушать их, спасибо! 

    namespace GUI
    {
        public partial class Form1 : Form
        {
     
            public Form1()
            {
                InitializeComponent();
            }
            Image MemForImage;
            private void button1_Click(object sender, EventArgs e) // ОТКРЫТИЕ
            {
                openFileDialog1.Filter = "All Files (*.*)| *.*| Image Files(*.JPG)|*.JPG| Image Files(*.GIF)|*.GIF| Image Files(*.PNG)|*.PNG | Image Files(*.BMP)|*.BMP";
     
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    try // безопасная попытка 
                    {
                        MemForImage = Image.FromFile(openFileDialog1.FileName);   // пытаемся загрузить файл с именем openFileDialog1.FileName - выбранный пользователем файл.
                        pictureBox1.Image = MemForImage;// устанавливаем картинку в поле элемента PictureBox 
                    }
                    catch (Exception ex) // если попытка загрузки не удалась 
                    {
                        MessageBox.Show("Не удалось загрузить файл: " + ex.Message);// выводим сообщение с причиной ошибки 
                    }
     
                }
                buttonText.Visible = true;
                buttonTextColor.Visible = true;
                buttonTextFont.Visible = true;
                textBox1.Visible = true;
                textBoxOX.Visible = true;
                textBoxOY.Visible = true;
                textBoxX.Visible = true;
                textBoxY.Visible = true;
                buttonAll.Visible = true;
          
        }
     
            private void button2_Click(object sender, EventArgs e) //СОХРАНЕНИЕ
            {
                if (pictureBox1.Image != null)
                {
                    Bitmap bmpSave = new Bitmap(pictureBox1.DisplayRectangle.Width, pictureBox1.DisplayRectangle.Height);
                    pictureBox1.DrawToBitmap(bmpSave, pictureBox1.DisplayRectangle);
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.DefaultExt = "bmp";
                    sfd.Filter = "All Files (*.*)| *.*| Image Files(*.JPG)|*.JPG| Image Files(*.GIF)|*.GIF| Image Files(*.PNG)|*.PNG | Image Files(*.BMP)|*.BMP";
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        bmpSave.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
                    }
                }
     
            }
     
            private void buttonClean_Click(object sender, EventArgs e) // ОЧИЩЕНИЕ
            {
                pictureBox1.Image = null;
                textBox1.Text = null;
                buttonText.Visible = false;
                buttonTextColor.Visible = false;
                buttonTextFont.Visible = false;
                textBox1.Visible = false;
                textBoxOX.Visible = false;
                textBoxOY.Visible = false;
                textBoxX.Visible = false;
                textBoxY.Visible = false;
                buttonAll.Visible = false;
            }
            
            public void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                int i = Int32.Parse(textBoxOX.Text);
                int j = Int32.Parse(textBoxOY.Text);
     
                e.Graphics.DrawString(textBox1.Text, textBox1.Font, new SolidBrush(colorDialog1.Color), new Point (i,j)); //перерисовка текста
            }
     
            private void buttonText_Click(object sender, EventArgs e)
            {
                pictureBox1.Invalidate(); //команда на перерисовку текста
            }
     
            private void buttonTextFont_Click(object sender, EventArgs e)
            {
                if (fontDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox1.Font = fontDialog1.Font; //Меняет шрифт 
                }               
            }
     
            public void buttonTextColor_Click(object sender, EventArgs e)
            {
                if (colorDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox1.ForeColor = colorDialog1.Color;
                }
            } 
        }     
    }


    • Изменено MatveyP 16 июня 2019 г. 11:34
    16 июня 2019 г. 11:31

Ответы

  • У вас идет рисование на 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!");
            }      
        }  
    }
    

    17 июня 2019 г. 6:50