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

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

содержание

Добейтесь эффекта вертикальных жалюзи.

Чередование изображений по горизонтали

Отображение эффекта текстуры

добиться рельефного эффекта

добиться эффекта пленки

Реализуйте эффект строительного блока

Изображение дисплея с эффектом смягчения


Добейтесь эффекта вертикальных жалюзи.

Принцип: Разделите изображение на несколько областей, каждая область постепенно отображается в прогрессивном порядке, а эффект подобен щелканию жалюзи. Методы GetRixel и SetPixel класса Bitmap в основном используются для получения и установки цвета указанного пикселя изображения, а затем используют метод Refresh для обновления фона формы.

 

    private void button1_Click(object sender, EventArgs e)

        {

openFileDialog1.Filter = "*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";//Устанавливаем тип файла

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

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

This.BackgroundImage = myImage;//Показать открытое изображение

        }

        private void button2_Click(object sender, EventArgs e)

        {

            try

            {

Bitmap myBitmap = (Bitmap)this.BackgroundImage.Clone();//Создаем экземпляр класса Bitmap с копией фона формы

int intWidth = myBitmap.Width;//Записываем ширину картинки

int intHeight = myBitmap.Height/20;//Записываем указанную высоту картинки

Graphics myGraphics = this.CreateGraphics();//Создаем класс Graphics формы

myGraphics.Clear(Color.WhiteSmoke);//Очистить фон формы указанным цветом

Point[] myPoint = new Point[30];//Определяем массив

For (int i = 0; i

                {

                    myPoint[i].X = 0;

                    myPoint[i].Y = i * intHeight;

                }

Bitmap bitmap = new Bitmap(myBitmap.Width, myBitmap.Height);//Создание экземпляра класса Bitmap

// Сбросьте цвет пикселя изображения, вызвав метод SetPixel объекта Bitmap для достижения эффекта затвора

                for (int m = 0; m < intHeight; m++)

                {

                    for (int n = 0; n < 20; n++)

                    {

                        for (int j = 0; j < intWidth; j++)

                        {

bitmap.SetPixel(myPoint[n].X + j, myPoint[n].Y + m, myBitmap.GetPixel(myPoint[n].X + j,myPoint[n].Y + m));//Получить текущее значение цвета пикселя

                        }

                    }

This.Refresh();//Рисунок недействителен

This.BackgroundImage = bitmap;//Отображение эффекта затвора окна

System.Threading.Thread.Sleep(100);//Поток зависает

                }

            }

            catch { }

        }

Чередование изображений по горизонтали

Принцип реализации: Разделите изображение на две части, левую и правую, а затем переместите их из левого и правого направлений в середину формы и, наконец, сформируйте картинку. В основном используются методы GetPixel и SetPixel Bitmap.

 

 

private void button1_Click(object sender, EventArgs e)

        {

openFileDialog1.Filter = "*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";//Устанавливаем тип файла

OpenFileDialog1.ShowDialog();//Диалог открытия файла

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

myBitmap = new Bitmap(myImage);//Создаем экземпляр класса Bitmap

This.BackgroundImage = myBitmap;//Показать открытое изображение

        }

 

        private void button2_Click(object sender, EventArgs e)

        {

            try

            {

int intWidth = this.BackgroundImage.Width;//Получить ширину фонового изображения

int intHeight = this.BackgroundImage.Height;//Получить высоту фонового изображения

Graphics myGraphics = this.CreateGraphics();//Создаем класс Graphics формы

MyGraphics.Clear(Color.WhiteSmoke);//Очистить указанным цветом

Bitmap bitmap = new Bitmap(intWidth, intHeight); //Создаем экземпляр класса Bitmap

                int i = 0;

// Отобразите изображение, вызвав метод SetPixel объекта Bitmap для достижения эффекта горизонтальной чересстрочной развертки

                while (i <= intWidth / 2)

                {

                    for (int m = 0; m <= intHeight - 1; m++)

                    {

bitmap.SetPixel(i, m, myBitmap.GetPixel(i, m));//Установить значение цвета текущего пикселя

                    }

                    for (int n = 0; n <= intHeight - 1; n++)

                    {

bitmap.SetPixel(intWidth - i - 1, n, myBitmap.GetPixel(intWidth - i - 1, n));//Установить значение цвета текущего пикселя

                    }

                    i++;

//рабочее пространство недействительно

This.BackgroundImage = bitmap;//Отображение изображения с чередованием по горизонтали

System.Threading.Thread.Sleep(10);//Поток зависает

                }

            }

            catch { }

        }

Отображение эффекта текстуры

Принцип реализации: использовать метод LockBits объекта Bitmap для блокировки изображения в памяти, затем получить адрес данных первого пикселя в изображении через свойство Scan0 объекта BitmapData, и, наконец, использовать метод Copy объекта System Класс .Runtime.InteropServices.Marshal as Укажите пиксели изображения для поиска смерти и используйте преобразованное изображение в качестве нового фона формы.

 

Код:

   private void button1_Click(object sender, EventArgs e)

        {

openFileDialog1.Filter = "*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";//Установить тип файла

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

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

myBitmap = new Bitmap(myImage);//Создаем экземпляр класса Bitmap

This.BackgroundImage = myBitmap;//Показать открытое изображение

        }

        private void button2_Click(object sender, EventArgs e)

        {

            try

            {

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

myBitmap = new Bitmap(myImage);//Создаем экземпляр класса Bitmap

Rectangle rect = new Rectangle(0, 0, myBitmap.Width, myBitmap.Height);//Создаем экземпляр класса Rectangle

                System.Drawing.Imaging.BitmapData bmpData = myBitmap.LockBits(rect,

System.Drawing.Imaging.ImageLockMode.ReadWrite, myBitmap.PixelFormat); // Блокируем указанное изображение в памяти

IntPtr ptr = bmpData.Scan0;//Получить адрес данных первого пикселя в изображении

Int bytes = myBitmap.Width * myBitmap.Height * 3;//Устанавливаем размер

byte[] rgbValues ​​= new byte[bytes];//Создаем экземпляр массива байтов

System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);//Назначаем массив rgbValues, используя значение RGB

for (int counter = 0; counter

                    rgbValues[counter] = 255;

System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);//Используем значения RGB для окрашивания пикселей изображения

MyBitmap.UnlockBits(bmpData);//Разблокировать изображение из памяти

This.BackgroundImage = myBitmap;//Показать картинку после установки

            }

            catch { }

        }

добиться рельефного эффекта

Принцип реализации: получить цвет каждого пикселя с помощью метода GetPixel объекта Bitmap, затем использовать свойство RGB объекта Color для получения значения элемента RGB каждого пикселя и использовать эти значения для вычитания значения соседнего пикселя плюс 128 и, наконец, используйте метод SetPixel объекта Bitmap, который перекрашивает пиксели растрового изображения.

Код:

  public partial class Frm_Main : Form

    {

        Bitmap myBitmap;

        Image myImage;

        public Frm_Main()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

openFileDialog1.Filter = "*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";//Устанавливаем тип файла

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

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

myBitmap = new Bitmap(myImage);//Создаем экземпляр класса Bitmap

This.BackgroundImage = myBitmap;//Показать открытое изображение

        }

        private void button2_Click(object sender, EventArgs e)

        {

            try

            {

myBitmap = new Bitmap(myImage);//Создаем экземпляр класса Bitmap

// перебираем все пиксели изображения

                for (int i = 0; i < myBitmap.Width - 1; i++)

                {

                    for (int j = 0; j < myBitmap.Height - 1; j++)

                    {

Color Color1 = myBitmap.GetPixel(i, j);//Получить значение цвета текущего пикселя

Color Color2 = myBitmap.GetPixel(i + 1, j + 1);//Получить значение цвета пикселя под диагональной точкой

int red = Math.Abs(Color1.R - ​​Color2.R + 128);//Установить значение цвета R

int green = Math.Abs(Color1.G - Color2.G + 128);//Устанавливаем значение цвета G

int blue = Math.Abs(Color1.B - Color2.B + 128);//Установить значение цвета B

//обработка цвета

Если (красный > 255) красный = 255; //Если значение цвета R больше 255, установите значение цвета R на 255

Если (красный

Если (зеленый > 255) зеленый = 255; //Если значение цвета G больше 255, установите значение цвета R на 255

Если (зеленый

Если (синий > 255) синий = 255; //Если значение цвета B больше 255, установите значение цвета R на 255

If (blue

//Перекрашиваем пиксели изображения, вызывая метод SetPixel объекта Bitmap

                        myBitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));

                    }

                }

This.BackgroundImage = myBitmap;//Показать обработанное изображение

            }

            catch { }

        }

}

добиться эффекта пленки

Принцип реализации: инвертировать существующее изображение.

 

Код:

private void button1_Click(object sender, EventArgs e)

         {

            try

            {

int Height = this.pictureBox1.Image.Height;//Получить высоту картинки

int Width = this.pictureBox1.Image.Width;//Получить ширину картинки

Bitmap newbitmap = new Bitmap(Width, Height);//Создаем экземпляр растрового объекта

Bitmap oldbitmap = (Bitmap)this.pictureBox1.Image;//Получить исходное изображение

Пиксель цвета;//Определяем структуру цвета

//обходим каждую позицию изображения

                for (int x = 1; x < Width; x++)

                {

                    for (int y = 1; y < Height; y++)

                    {

Int r, g, b;//Определяем 3 переменные для записи значения R\G\B указанной точки

pixel = oldbitmap.GetPixel(x, y);//Получить значение пикселя указанной точки

r = 255 - pixel.R;//Записываем значение R

G = 255 - пиксель.G;//Запись значения G

B = 255 - пиксель.B;//Запись значения B

Newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));//Перекрасить указанную точку

                    }

                }

This.pictureBox1.Image = newbitmap;//Показать изображение негативного эффекта

            }

            catch (Exception ex)

            {

MessageBox.Show(ex.Message, "Информационная подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

     }

Реализуйте эффект строительного блока

Принцип реализации: сосредоточьтесь на окрашивании каждого пикселя изображения, возьмите значение RGB одного пикселя и возьмите среднее значение.Если среднее значение больше 128, установите его на 255, в противном случае установите на 0.

 

Код:

private void button1_Click(object sender, EventArgs e)

     {

            openFileDialog1.Filter = "*.jpg,*.jpeg,*.bmp|*.jpg;*.jpeg;*.bmp";

            openFileDialog1.ShowDialog();

            Image myImage = System.Drawing.Image.FromFile(openFileDialog1.FileName);

            this.BackgroundImage = myImage;

        }

        private void button2_Click(object sender, EventArgs e)

        {

Graphics myGraphics = this.CreateGraphics();//Создаем класс Graphics формы

Bitmap myBitmap = new Bitmap(openFileDialog1.FileName);//Создаем экземпляр класса Bitmap

int myWidth, myHeight, i, j, iAvg, iPixel; // определяем переменные

Color myColor, myNewColor; // Определяем цветовые переменные

            RectangleF myRect;

myWidth = myBitmap.Width;//Получить ширину фонового изображения

myHeight = myBitmap.Height;//Получить высоту фонового изображения

myRect = new RectangleF(0, 0, myWidth, myHeight); //Получить площадь картинки

Bitmap bitmap = myBitmap.Clone(myRect, System.Drawing.Imaging.PixelFormat.DontCare);//Создаем экземпляр класса Bitmap

            i = 0;

//обходим все пиксели изображения

            while (i < myWidth - 1)

            {

                j = 0;

                while (j < myHeight - 1)

                {

myColor = bitmap.GetPixel(i, j);//Получить значение цвета текущего пикселя

iAvg = (myColor.R + myColor.G + myColor.B) / 3;//Метод среднего

                    iPixel = 0;

If (iAvg >= 128) // если значение цвета больше или равно 128

iPixel = 0; // Установите значение 255

                    else

                        iPixel = 255;

//Получить цвет каждого пикселя изображения, вызвав метод FromArgb объекта Color

                    myNewColor = Color.FromArgb(255, iPixel, iPixel, iPixel);

bitmap.SetPixel(i, j, myNewColor);//Установить значение цвета

                    j = j + 1;

                }

                i = i + 1;

            }

            myGraphics.Clear(Color.WhiteSmoke);

bitmap.Save("D:11.bmp");//Очистить указанным цветом

myGraphics.DrawImage(bitmap, new Rectangle(0, 0, myWidth, myHeight));//Рисуем обработанное изображение

    }

Изображение дисплея с эффектом смягчения

Принцип реализации: Сравните цвет текущего пикселя и окружающих пикселей, Если разница в цвете большая, переходите к среднему значению, в противном случае берите исходное значение и перекрашивайте изображение.

 

Код:

  private void button2_Click(object sender, EventArgs e)

        {

// тип файла изображения

            OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "Файл изображения (JPeg, Gif, Bmp и т. д.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif;*.tiff;*.png|Файл изображения JPEG( *.jpg;*.jpeg)|*.jpg;*.jpeg |Файл изображения GIF(*.gif)|*.gif |Файл изображения BMP(*.bmp)|*.bmp|Файл изображения Tiff(*.tif) ;*.tiff)|*.tif;*.tiff|Файлы изображений Png (*.png)| *.png|все файлы (*.*)|*.*";

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

            {

                Bitmap MyBitmap = new Bitmap(openFileDialog.FileName);

                this.pictureBox1.Image = MyBitmap;

            }

        }

        private void button1_Click(object sender, EventArgs e)

        {

            try

            {

int Height = this.pictureBox1.Image.Height;//Получить высоту изображения

Int Width = this.pictureBox1.Image.Width;//Получить ширину изображения

Bitmap bitmap = new Bitmap(Width, Height);//Создание нового объекта растрового изображения

Bitmap MyBitmap = (Bitmap)this.pictureBox1.Image;//Запись исходного изображения

Пиксель цвета;//Определяем структуру цвета

int[] Gauss ={ 1, 2, 1, 2, 4, 2, 1, 2, 1 };//Определяем значение шаблона Гаусса

// Обход каждой позиции исходного изображения

                for (int x = 1; x < Width - 1; x++)

                    for (int y = 1; y < Height - 1; y++)

                    {

Int r = 0, g = 0, b = 0;//объявляем 3 переменные для записи значений R/G/B

Int Index = 0;//Объявить переменную для записи позиции

                        for (int col = -1; col <= 1; col++)

                            for (int row = -1; row <= 1; row++)

                            {

pixel = MyBitmap.GetPixel(x + row, y + col);//Получить пиксель указанной точки

r += pixel.R * Gauss[Index];//Запись значения R

G += пиксель.G * Gauss[Index];//Запись значения G

B += пиксель.B * Gauss[Index];//Запись значения B

                                Index++;

                            }

r /= 16;//Переназначить R

G /= 16;//Переназначить G

B /= 16;//Переназначить B

//Обработка переполнения значения цвета

                        r = r > 255 ? 255 : r;

                        r = r < 0 ? 0 : r;

                        g = g > 255 ? 255 : g;

                        g = g < 0 ? 0 : g;

                        b = b > 255 ? 255 : b;

                        b = b < 0 ? 0 : b;

bitmap.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));//Переназначаем значение цвета указанной точке

                    }

This.pictureBox1.Image = bitmap;//Показать изображение с эффектом смягчения

            }

            catch (Exception ex)

            {

MessageBox.Show(ex.Message, "подсказка сообщения");

            }

        }