GDI+——常用的图像处理技术(二)

简介: GDI+——常用的图像处理技术(二)

目录


实现垂直百叶窗效果。


水平交错显示图像


纹理效果展示


实现浮雕效果


实现胶片效果


实现积木效果


柔化效果显示图片


实现垂直百叶窗效果。

原理:将图像分成若干个区域,各个区月以一种渐进的方式逐渐显示,效果就像百叶窗翻动一样。主要用到了Bitmap类的GetRixel和SetPixel方法,获取和设置图像中指定像素的颜色,然后使用Refresh方法重新刷新窗体背景。

tt.png

 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 < 30; i++)    //记录百叶窗各节点的位置


               {


                   myPoint[i].X = 0;


                   myPoint[i].Y = i * intHeight;


               }


               Bitmap bitmap = new Bitmap(myBitmap.Width, myBitmap.Height);//实例化Bitmap类


               //通过调用Bitmap对象的SetPixel方法重新设置图像的像素点颜色,从而实现百叶窗效果


               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 { }


       }


水平交错显示图像

实现原理:将一幅图像分成左右两部分,然后使他们分别从左右两个方向向窗体中间移动,最终形成一幅图画。主要用到了Bitmap的GetPixel方法和SetPixel方法。


 

tt.png

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;


               //通过调用Bitmap对象的SetPixel方法实现水平交错效果显示图像


               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.Refresh();                                     //工作区无效


                   this.BackgroundImage = bitmap;      //显示水平交错的图片


                   System.Threading.Thread.Sleep(10);              //线程挂起


               }


           }


           catch { }


       }


纹理效果展示

实现的原理:使用Bitmap对象的LockBits方法将图像锁定到内存中,然后通过BitmapData对象的Scan0属性获得图像中第一个像素数据的地址,最后通过使用System.Runtime.InteropServices.Marshal类的Copy方法为指定图像的像素点找死,并用变换后的图像作为窗体的新背景。

tt.png

代码:


  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];//实例化byte数组


               System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); //使用RGB值为声明的rgbValues数组赋值


               for (int counter = 0; counter < rgbValues.Length; counter += 3) //初始化大小


                   rgbValues[counter] = 255;


               System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes); //使用RGB值为图像的像素点着色


               myBitmap.UnlockBits(bmpData); //从内存中解锁图像


               this.BackgroundImage = myBitmap;//显示设置后的图片


           }


           catch { }


       }


实现浮雕效果

实现原理:通过Bitmap对象的GetPixel方法获取各像素点的颜色,然后分别使用Color对象的RGB属性获得各像素点的RGB元素值,并使用这些值减去相邻像素值再加上128,最后使用Bitmap对象的SetPixel方法重新位图像的像素点着色。


tt.png

代码:


 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色值


                       //颜色处理


                       if (red > 255) red = 255;   //如果R色值大于255,将R色值设为255


                       if (red < 0) red = 0;   //如果R色值小于0,将R色值设为0


                       if (green > 255) green = 255; //如果G色值大于255,将R色值设为255


                       if (green < 0) green = 0; //如果G色值小于0,将R色值设为0


                       if (blue > 255) blue = 255;                             //如果B色值大于255,将R色值设为255


                       if (blue < 0) blue = 0;                             //如果B色值小于0,将R色值设为0


                       //通过调用Bitmap对象的SetPixel方法为图像的像素点重新着色


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


                   }


               }


               this.BackgroundImage = myBitmap;                            //显示处理后的图片


           }


           catch { }


       }


}


实现胶片效果

实现原理:对现有的图像取反色。

tt.png

代码:


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;//获取原图


               Color pixel;//定义一个Color结构


               //遍历图片的每个位置


               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 - pixel.G;//记录G值


                       b = 255 - pixel.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。

tt.png

代码:


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;


                   //通过调用Color对象的FromArgb方法获得图像各像素点的颜色


                   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));   //绘制处理后的图片


   }


柔化效果显示图片

实现原理:将当前像素和周围的像素点的颜色进行比较,如果颜色差距较大,则去平均值,否则取原来的值,重新给你图像着色。


 

20200522165741485.png

代码:


 private void button2_Click(object sender, EventArgs e)


       {


           //打图像文件


           OpenFileDialog openFileDialog = new OpenFileDialog();


           openFileDialog.Filter = "图像文件(JPeg, Gif, Bmp, etc.)|*.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;//记录原图


               Color pixel;//定义一个Color结构


               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 += pixel.G * Gauss[Index];//记录G值


                               b += pixel.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, "信息提示");


           }


       }



tt.png


 


tt.png

目录
相关文章
|
5月前
|
编解码 算法 计算机视觉
图像处理之高斯金字塔
图像处理之高斯金字塔
44 3
|
5月前
|
计算机视觉
图像处理之水纹效果
图像处理之水纹效果
28 1
|
5月前
|
计算机视觉
图像处理之图像梯度效果
图像处理之图像梯度效果
32 0
|
5月前
|
算法 前端开发 数据建模
图像处理之半调色融合
图像处理之半调色融合
32 0
|
6月前
|
机器学习/深度学习 编解码 算法
计算机视觉实战项目2(单目测距+图像处理+路径规划+车牌识别)
计算机视觉实战项目2(单目测距+图像处理+路径规划+车牌识别)
|
算法 数据安全/隐私保护 计算机视觉
图像处理基础
图像处理基础
106 0
|
存储 人工智能 算法
入门|图像处理技术
入门|图像处理技术
185 0
|
机器学习/深度学习 监控 算法
传统图像处理之相机模型
传统图像处理之相机模型
252 0
|
计算机视觉 异构计算
|
存储 编解码 算法
图像处理入门
图像处理入门
73 0
图像处理入门