GDI+ — широко используемая технология обработки изображений (1)

искусственный интеллект

содержание

Пакетное преобразование изображений.

генерировать эскизы

Поворачивайте и переворачивайте изображения

Отображает овальное изображение.


Пакетное преобразование изображений.

Пакетное преобразование изображений в основном использует класс Thread и класс ImageFormat. Используйте класс Thread, чтобы открыть новый поток для выполнения пакетного преобразования изображений, чтобы программа не достигла приостановки анимации.

 

namespace PictureBatchConversion

{

public partial class Frm_Main : Form

{

public Frm_Main()

{

    InitializeComponent();

}

string[] path1=null; // используется для хранения выбранного списка файлов

string path2=""; //путь для хранения и сохранения

Bitmap bt; // Объявляем объект Bitmap, который преобразует формат изображения

Thread td; // объявляем поток

int Imgtype1; //объявляем переменную для обозначения типа, преобразованного в методе ConvertImage

string OlePath; // Объявляем переменную для хранения пути исходного изображения в методе ConvertImage

string path; //объявляем переменную для хранения пути сохранения сконвертированного изображения в методе ConvertImage

int flags; // используется для обозначения количества конвертированных изображений, используемых для расчета прогресса конвертации

private void Form2_Load(object sender, EventArgs e)

 {

tscbType.SelectedIndex = 0;//Устанавливаем первый выбранный тип преобразования

CheckForIllegalCrossThreadCalls = false;//блокируем всплывающее сообщение об ошибке потока

   }

private void toolStripButton3_Click(object sender, EventArgs e)//Выберите кнопку для преобразования файла

  {

If (openFileDialog1.ShowDialog() == DialogResult.OK) //Определяем, нужно ли выбирать файл

    {

listView1.Items.Clear();//Очистить listView1

string[] info = new string[7]; // Сохраняем каждую строку данных

FileInfo fi; //Создаем объект FileInfo для получения информации об изображении

path1 = openFileDialog1.FileNames;//Получить выбранную коллекцию изображений

for (int i = 0; i

      {

//Получить имя изображения

       string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);

//Получить тип изображения

       string ImgType = ImgName.Substring(ImgName.LastIndexOf(".") + 1, ImgName.Length - ImgName.LastIndexOf(".") - 1);

fi = new FileInfo(path1[i].ToString());//Создаем экземпляр объекта FileInfo

// Добавляем значок в первую позицию каждой строки данных в imageList1

imageList1.Images.Add(ImgName,Properties.Resources.icon__23_);

info[1] = ImgName;//имя изображения

info[2] = ImgType;//тип изображения

info[3] = fi.LastWriteTime.ToShortDateString();//дата последней модификации картинки

info[4] = path1[i].ToString();//расположение изображения

info[5] = (fi.Length/1024)+"KB";//размер изображения

info[6] = "не преобразовано";//статус изображения

ListViewItem lvi = new ListViewItem(info, ImgName); //Создаем экземпляр объекта ListViewItem

listView1.Items.Add(lvi);//Добавляем информацию в элемент управления listView1

      }

tsslFileNum.Text = "текущее количество" + path1.Length.ToString() + "files";//количество картинок, отображаемых в строке состояния

            }

        }

private void toolStripButton2_Click (отправитель объекта, EventArgs e) // кнопка закрытия

    {

Application.Exit();//Выходим из системы

   }

private void toolStripButton5_Click(object sender, EventArgs e) //Кнопка для очистки списка

   {  

listView1.Items.Clear();//Очищаем список

path1 = null; //очистить коллекцию картинок

tsslFileNum.Text = "В данный момент файла нет";//Подсказка в строке состояния

tsslPlan.Text = "";//Очистить номер прогресса

   }

   private void toolStripButton1_Click(object sender, EventArgs e)

   {

If (path1 == null) // Определяем, нужно ли выбирать картинку

     {

MessageBox.Show("Выберите изображение!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);

     }

     else

     {

If (path2.Length == 0) // Решаем, выбирать ли место для сохранения

        {

MessageBox.Show("Выберите место для сохранения!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        else

        {

Flags = 1; //Инициализируем переменную flags значением 1 для подсчета прогресса

toolStrip1.Enabled = false;//Когда начинается переход, отключаем панель инструментов

int flag = tscbType.SelectedIndex;//Определяем, в какой формат конвертировать изображение

switch (флаг) //конвертировать в соответствии с разными форматами

          {

             case 0:

Imgtype1 = 0; //Если выбран первый элемент, конвертируем в формат BMP

td = new Thread(new ThreadStart(ConvertImage)); //Вызов метода ConvertImage через поток для преобразования

             td.Start();

             break;

Случай 1: //Если выбран второй элемент, конвертировать в формат JPG

             Imgtype1 = 1;

td = new Thread(new ThreadStart(ConvertImage));//Вызываем метод ConvertImage через поток для преобразования

             td.Start();

             break;

Случай 2: //Если выбран третий элемент, конвертировать в формат PNG

             Imgtype1 = 2;

td = new Thread(new ThreadStart(ConvertImage));//Вызываем метод ConvertImage через поток для преобразования

             td.Start();

             break;

Случай 3: //Если выбран четвертый элемент, конвертировать в формат GIF

             Imgtype1 = 3;

td = new Thread(new ThreadStart(ConvertImage));//Вызываем метод ConvertImage через поток для преобразования

             td.Start();

             break;

             default: td.Abort(); break;

                    }

                }

            }

  }

private void toolStripButton4_Click(object sender, EventArgs e)//Выберите кнопку сохранения пути

  {

If (folderBrowserDialog1.ShowDialog() == DialogResult.OK) //Определяем, следует ли выбирать путь сохранения

     {

Path2 = folderBrowserDialog1.SelectedPath;//Получить путь сохранения

     }

 }

 private void ConvertImage()

 {

   flags = 1;

   switch (Imgtype1)

   {

       case 0:

           for (int i = 0; i < path1.Length; i++)

           {

               string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);

               ImgName = ImgName.Remove(ImgName.LastIndexOf("."));

               OlePath = path1[i].ToString();

               bt = new Bitmap(OlePath);

               path = path2 + "\" + ImgName + ".bmp";

               bt.Save(path, System.Drawing.Imaging.ImageFormat.Bmp);

listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";

tsslPlan.Text = "Преобразование"+флаги*100/path1.Length+"%";

               if (flags == path1.Length)

               {

                  toolStrip1.Enabled = true;

tsslPlan.Text = "Преобразование изображения завершено";

                        }

                       flags++;

                }

                break;

         case 1:

         for (int i = 0; i < path1.Length; i++)

         {

           string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);

          ImgName = ImgName.Remove(ImgName.LastIndexOf("."));

          OlePath = path1[i].ToString();

          bt = new Bitmap(OlePath);

          path = path2 + "\" + ImgName + ".jpeg";

          bt.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);

listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";

tsslPlan.Text = "Преобразование" + flags * 100 / path1.Length + "%";

          if (flags == path1.Length)

          {

              toolStrip1.Enabled = true;

tsslPlan.Text = "Преобразование изображения завершено";

          }

          flags++;

         }

          break;

          case 2:

           for (int i = 0; i < path1.Length; i++)

           {

             string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);

            ImgName = ImgName.Remove(ImgName.LastIndexOf("."));

           OlePath = path1[i].ToString();

           bt = new Bitmap(OlePath);

           path = path2 + "\" + ImgName + ".png";

           bt.Save(path, System.Drawing.Imaging.ImageFormat.Png);

listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";

tsslPlan.Text = "Преобразование" + flags * 100 / path1.Length + "%";

            if (flags == path1.Length)

            {

                toolStrip1.Enabled = true;

tsslPlan.Text = "Преобразование изображения завершено";

            }

            flags++;

           }

           break;

           case 3:

          for (int i = 0; i < path1.Length; i++)

          {

              string ImgName = path1[i].Substring(path1[i].LastIndexOf("\") + 1, path1[i].Length - path1[i].LastIndexOf("\") - 1);

          ImgName = ImgName.Remove(ImgName.LastIndexOf("."));

          OlePath = path1[i].ToString();

          bt = new Bitmap(OlePath);

          path = path2 + "\" + ImgName + ".gif";

          bt.Save(path, System.Drawing.Imaging.ImageFormat.Gif);

listView1.Items[flags - 1].SubItems[6].Text = "Преобразовано";

tsslPlan.Text = "Преобразование" + flags * 100 / path1.Length + "%";

          if (flags == path1.Length)

          {

              toolStrip1.Enabled = true;

tsslPlan.Text = "Преобразование изображения завершено";

          }

          flags++;

         }

         break;

         default: bt.Dispose(); break;

      }

  }

private void Form2_FormClosed(object sender, FormClosedEventArgs e)//Закрывать поток при закрытии окна

  {

if (td != null) //Определяем, есть ли поток

      {

If (td.ThreadState == ThreadState.Running) //Затем определяем, запущен ли поток

         {

td.Abort();//Закрыть поток, если он запущен

         }

      }

   }

}

}

генерировать эскизы

Реализация этого примера в основном использует метод GetThumbnailImage класса Image для создания эскизов изображений. Сгенерированные эскизы помещаются в ListView. Чтобы предотвратить очень серьезное явление мерцания и повлиять на общий просмотр, в этом примере также переписывается элемент управления ListView, чтобы устранить явление мерцания.

public partial class Frm_Main : Form

    {

        public class CustomListView : ListView

        {

            public CustomListView()

            {

                SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

                UpdateStyles();

            }

        }

        CustomListView clv = new CustomListView();

       

        public Frm_Main()

        {

            InitializeComponent();

        }

        string filePath;

        public Image ResourceImage;

        private int ImageWidth;

        private int ImageHeight;

        public string ErrMessage;

        public Thread td;

        public bool GetReducedImage(double Percent, string targetFilePath)

        {

            try

            {

Bitmap bt = new Bitmap(120, 120);//Создать экземпляр Bitmap

Graphics g = Graphics.FromImage(bt);//Создаем экземпляр Graphics

//Устанавливаем белый цвет фона холста

// Миниатюра изображения Уменьшенное изображение; // Миниатюра

                Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);//Устанавливаем ширину

ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent);//Устанавливаем высоту

// Получаем так называемый график

                ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);

If (ImageWidth > ImageHeight) if (ImageWidth > ImageHeight) //Если исходная ширина изображения больше высоты

                {

//Увеличить картинку

                    g.DrawImage(ReducedImage, 0, (int)(120 - ImageHeight) / 2, ImageWidth, ImageHeight);

                }

                else

                {

                    g.DrawImage(ReducedImage, (int)(120 - ImageWidth) / 2, 0, ImageWidth, ImageHeight);

                }

g.DrawRectangle(new Pen(Color.Gray), 0, 0, 119, 119);//Рисуем границу миниатюры

bt.Save(@targetFilePath, ImageFormat.Jpeg);//Сохраняем миниатюру

bt.Dispose();//Освобождаем объект

//ReducedImage.Dispose();//Освобождаем объект

                return true;

            }

            catch (Exception e)

            {

                ErrMessage = e.Message;

                return false;

            }

        }

        public bool ThumbnailCallback()

        {

            return false;

        }

        private void a()

        {

            double percent;

            string[] a = new string[2];

            DirectoryInfo di = new DirectoryInfo(filePath);

            FileSystemInfo[] fi = di.GetFileSystemInfos();

            DirectoryInfo di2 = new DirectoryInfo("c:\\LsTemp");

            for (int i = 0; i < fi.Length; i++)

            {

                string imgType = fi[i].ToString().Substring(fi[i].ToString().LastIndexOf(".") + 1, fi[i].ToString().Length - 1 - fi[i].ToString().LastIndexOf("."));

                if (imgType.ToLower() == "jpeg" || imgType.ToLower() == "gif" || imgType.ToLower() == "png" || imgType.ToLower() == "jpg" || imgType.ToLower() == "bmp")

                {

                    string imgName = fi[i].ToString();

                    imgName = imgName.Remove(imgName.LastIndexOf("."));

                    string newPath;

                    if (filePath.Length == 3)

                    {

                        newPath = filePath + imgName + "." + imgType;

                    }

                    else

                    {

                        newPath = filePath + "\" + imgName + "." + imgType;

                    }

                    ResourceImage = Image.FromFile(newPath);

                    if (ResourceImage.Width < ResourceImage.Height)

                    {

                        percent = (double)120 / ResourceImage.Height;

                    }

                    else

                    {

                        percent = (double)120 / ResourceImage.Width;

                    }

                    if (!di2.Exists)

                    {

                        Directory.CreateDirectory("c:\\LsTemp");

                        if (GetReducedImage(percent, "c:\\LsTemp\\_" + imgName + ".JPG"))

                        {

                            imageList1.Images.Add(i.ToString(), Image.FromFile("c:\\LsTemp\\_" + imgName + ".JPG"));

                            a[0] = imgName + "." + imgType;

                            ListViewItem lvi = new ListViewItem(a);

                            lvi.ImageKey = i.ToString();

                            clv.Items.Add(lvi);

                        }

                    }

                    else

                    {

                        if (GetReducedImage(percent, "c:\\LsTemp\\_" + imgName + ".JPG"))

                        {

                            imageList1.Images.Add(i.ToString(), Image.FromFile("c:\\LsTemp\\_" + imgName + ".JPG"));

                            a[0] = imgName + "." + imgType;

                            ListViewItem lvi = new ListViewItem(a);

                            lvi.ImageKey = i.ToString();

                            clv.Items.Add(lvi);

                        }

                    }

                    ResourceImage.Dispose();

                }

tsslText.Text = "Всего" + this.clv.Items.Count.ToString() + "Изображения";

            }

            td.Abort();

        }

        private void toolStripButton1_Click_1(object sender, EventArgs e)

        {

            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

            {

                clv.Items.Clear();

                filePath = folderBrowserDialog1.SelectedPath;

                td = new Thread(new ThreadStart(a));

                td.Start();

            }

        }

        private void toolStripButton2_Click(object sender, EventArgs e)

        {

            Application.Exit();

        }

        private void deletefile()

        {

            try

            {

                DirectoryInfo di2 = new DirectoryInfo("c:\\LsTemp");

                if (di2.Exists)

                {

                    Scripting.FileSystemObject fso = new Scripting.FileSystemObject();

                    fso.DeleteFolder("c:\\LsTemp", true);

                }

            }

            catch

            {

                deletefile();

            }

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)

        {

            if (td != null)

            {

                td.Abort();

            }

            deletefile();

        }

        private void clv_Click(object sender, EventArgs e)

        {

            if (clv.SelectedItems.Count > 0)

            {

                string pName = clv.SelectedItems[0].Text;

                if (filePath.Length == 3)

                {

tsslPath.Text = "Путь к изображению:" + filePath + pName;

                }

                else

                {

tsslPath.Text = "Путь к изображению: " + filePath + "\" + pName;

                }

            }

        }

        private void clv_DoubleClick(object sender, EventArgs e)

        {

            if (clv.SelectedItems.Count > 0)

            {

                string pName = clv.SelectedItems[0].Text;

                if (filePath.Length == 3)

                {

                    System.Diagnostics.Process.Start(filePath + pName);

tsslPath.Text = "Путь к изображению:" + filePath + pName;

                }

                else

                {

                    System.Diagnostics.Process.Start(filePath + "\" + pName);

tsslPath.Text = "Путь к изображению: " + filePath + "\" + pName;

                }

            }

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            CheckForIllegalCrossThreadCalls = false;

            panel1.Controls.Add(clv);

            clv.Dock = DockStyle.Fill;

            clv.LargeImageList = imageList1;

            clv.View = View.LargeIcon;

            clv.DoubleClick += new EventHandler(clv_DoubleClick);

            clv.Click+=new EventHandler(clv_Click);  

        }

    }

 

Поворачивайте и переворачивайте изображения

Изображение до поворота:

 

Повернутое изображение:

 

Для поворота изображения в основном используется метод RotateFlip класса Bitmap. Поверните и переверните изображение, когда придет этот метод.

Код:

 

private void button1_Click(object sender, EventArgs e)

        {

openFileDialog1.Filter = "*.jpg|*.jpg";//Устанавливаем тип картинки

openFileDialog1.ShowDialog();//Открыть диалоговое окно файла

Image myImage = System.Drawing.Image.FromFile(openFileDialog1.FileName);//Создаем экземпляр класса Image

PictureBox1.Image = myImage;//Показать открытую картинку

        }

        private void button2_Click(object sender, EventArgs e)

        {

Image myImage = pictureBox1.Image;//Создаем экземпляр класса Image

myImage.RotateFlip(RotateFlipType.Rotate90FlipXY);//Вызовите метод RotateFlip, чтобы повернуть изображение JPG

PictureBox1.Image = myImage;//Показать повернутое изображение

        }

Отображает овальное изображение.

 

В основном используйте метод FillEllipse класса Graphics для отображения открытого изображения в виде эллипса.

private void button1_Click(object sender, EventArgs e)

{

this.panel1.Refresh();//Обновить панель управления

Graphics g = this.panel1.CreateGraphics();//Создаем экземпляр объекта рисования

TextureBrush MyBrush = new TextureBrush(MyBitmap);//Создаем экземпляр объекта TextureBrush

g.FillEllipse(MyBrush, this.panel1.ClientRectangle);//Рисуем эллипс

 }