阅读量: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; }