WinForm中使用Bitmap元素处理图像

avatar
作者
筋斗云
阅读量:0

前言

这个Bitmap元素在我们处理图像显示相关时,它的身影就可以见到了。官方术语:封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。操作对象最重要的两个方法GetPixel和SetPixel。

一、效果

1、光环效果

2、亮度调节

3、彩色转黑白

4、色温反转

5、马赛克

6、扩散效果

二、代码示例

1、光环效果
 if (bitmap != null)             {                 newbitmap = bitmap.Clone() as Bitmap;                  stopwatch.Restart();                  int width = newbitmap.Width;                 int height = newbitmap.Height;                 float cx = width / 2;                 float cy = height / 2;                 float maxDist = cx * cx + cy * cy;                 float currDist = 0, factor;                 Color pixel;                  for (int i = 0; i < width; i++)                 {                     for (int j = 0; j < height; j++)                     {                         currDist = ((float)i - cx) * ((float)i - cx) + ((float)j - cy) * ((float)j - cy);                         factor = currDist / maxDist;                          pixel = newbitmap.GetPixel(i, j);                         int red = (int)(pixel.R * (1 - factor));                         int green = (int)(pixel.G * (1 - factor));                         int blue = (int)(pixel.B * (1 - factor));                         newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));                     }                 }                  stopwatch.Stop();                 lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";                 pictureBox2.Image = newbitmap.Clone() as Image;             }
2、亮度调节
if (bitmap != null)             {                 newbitmap = bitmap.Clone() as Bitmap;                 stopwatch.Reset();                 stopwatch.Restart();                 Color pixel;                 int red, green, blue;                 for (int x = 0; x < newbitmap.Width; x++)                 {                     for (int y = 0; y < newbitmap.Height; y++)                     {                         pixel = newbitmap.GetPixel(x, y);                         red = (int)(pixel.R * 0.6);                         green = (int)(pixel.G * 0.6);                         blue = (int)(pixel.B * 0.6);                         newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));                     }                 }                 stopwatch.Stop();                 lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";                 pictureBox2.Image = newbitmap.Clone() as Image;             }
3、彩色转黑白
if (bitmap != null)             {                 newbitmap = bitmap.Clone() as Bitmap;                 stopwatch.Reset();                 stopwatch.Restart();                 Color pixel;                 int gray;                 for (int x = 0; x < newbitmap.Width; x++)                 {                     for (int y = 0; y < newbitmap.Height; y++)                     {                         pixel = newbitmap.GetPixel(x, y);                         gray = (int)(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);                         newbitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray));                     }                 }                 stopwatch.Stop();                 lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";                 pictureBox2.Image = newbitmap.Clone() as Image;             }
4、色温反转
 if (bitmap != null)             {                 newbitmap = bitmap.Clone() as Bitmap;                 stopwatch.Restart();                 Color pixel;                 int red, green, blue;                 for (int x = 0; x < newbitmap.Width; x++)                 {                     for (int y = 0; y < newbitmap.Height; y++)                     {                         pixel = newbitmap.GetPixel(x, y);                         red = (int)(255 - pixel.R);                         green = (int)(255 - pixel.G);                         blue = (int)(255 - pixel.B);                         newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));                     }                 }                 stopwatch.Stop();                 lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";                 pictureBox2.Image = newbitmap.Clone() as Image;             }
5、马赛克
if (bitmap != null)             {                 newbitmap = bitmap.Clone() as Bitmap;                 stopwatch.Reset();                 stopwatch.Restart();                 int RIDIO = 50;//马赛克的尺度,默认为周围两个像素                 for (int h = 0; h < newbitmap.Height; h += RIDIO)                 {                     for (int w = 0; w < newbitmap.Width; w += RIDIO)                     {                         int avgRed = 0, avgGreen = 0, avgBlue = 0;                         int count = 0;                         //取周围的像素                         for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++)                         {                             for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)                             {                                 Color pixel = newbitmap.GetPixel(x, y);                                 avgRed += pixel.R;                                 avgGreen += pixel.G;                                 avgBlue += pixel.B;                                 count++;                             }                         }                          //取平均值                         avgRed = avgRed / count;                         avgBlue = avgBlue / count;                         avgGreen = avgGreen / count;                          //设置颜色                         for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++)                         {                             for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)                             {                                 Color newColor = Color.FromArgb(avgRed, avgGreen, avgBlue);                                 newbitmap.SetPixel(x, y, newColor);                             }                         }                     }                 }                 stopwatch.Stop();                 lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";                 pictureBox2.Image = newbitmap.Clone() as Image;             }
6、扩散效果
if (bitmap != null)             {                 newbitmap = bitmap.Clone() as Bitmap;                 stopwatch.Reset();                 stopwatch.Restart();                 Color pixel;                 int red, green, blue;                 int flag = 0;                 for (int x = 0; x < newbitmap.Width; x++)                 {                     for (int y = 0; y < newbitmap.Height; y++)                     {                         Random ran = new Random();                         int RankKey = ran.Next(-5, 5);                         if (x + RankKey >= newbitmap.Width || y + RankKey >= newbitmap.Height || x + RankKey < 0 || y + RankKey < 0)                         {                             flag = 1;                             continue;                         }                          pixel = newbitmap.GetPixel(x + RankKey, y + RankKey);                         red = (int)(pixel.R);                         green = (int)(pixel.G);                         blue = (int)(pixel.B);                         newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));                     }                 }                 stopwatch.Stop();                 lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString();                 pictureBox2.Image = newbitmap.Clone() as Image;             }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!