GDI+入门(十三、GDI+实例——灰度效果)
2010-01-06 10:31
239 查看
十三、GDI+实例——灰度效果
图片灰度化处理的方法主要有三种:
最大化法。这种方法的原理是使RGB的值等于值,即:
R=G=B=max(R,G,B)
使用最大化法处理后的灰度图像的亮度很高。
平均值法。这种方法的原理是使RGB的恒等于三个色彩分量的平均值,即
R=G=B= (R+G+B)/3
使用平均值法处理后的灰度图像亮度较为柔和。
加权平均值法。 “加权”是统计学中常用的名词,这种方法是根据重要性或其他
指标给R、G、D赋于不同的权值,并位R、G、B等于它们的加权平均值。即:
R=G=B=(rR+gG+bB))/3,r、g、b分别是R、G、B的权值*权数r、g、b取不同的值时,加权平均值法能够形成不同灰度的灰度图像。由于人眼对绿色的敏感度最高,红色次之,对蓝色的敏感度最低,因此,当权值矿的时,所生成的灰度图像更符合人眼的视觉感受。通常,当r=30%,g=59%,b=11%时,这种图像的灰度较为合理。
private static Bitmap bitmap;
private int width;
private int height;
public Form1()
{
InitializeComponent();
bitmap = new Bitmap(Application.StartupPath + "\\1.jpg");
width = bitmap.Width - 1;
height = bitmap.Height - 1;
}
Bitmap bmp2;
Bitmap bmp3;
Bitmap bmp4;
private void button1_Click(object sender, EventArgs e)
{
Graphics panel2G = panel2.CreateGraphics();
bmp2 = new Bitmap(width, height);
Color color;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color = bitmap.GetPixel(i, j);
int middle = (color.R + color.G + color.B) / 3;
Color colorResult = Color.FromArgb(255, middle, middle, middle);
bmp2.SetPixel(i, j, colorResult);
}
}
panel2G.DrawImage(bmp2, panel2.ClientRectangle);
panel2G.ResetTransform();
panel2G.TranslateTransform(width, 0);
// bmp2.Dispose();
panel2G.Dispose();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics panel1G = panel1.CreateGraphics();
panel1G.DrawImage(bitmap, panel1.ClientRectangle);
panel1G.Dispose();
}
private void ReDrawImage(Bitmap bmp0)
{
Color color;
for (int i = width - 1; i >= 0; i--)
{
for (int j = height - 1; j >= 0; j--)
{
color = bmp0.GetPixel(i, j);
int r = color.R;
int g = color.G;
int b = color.B;
//还原红色
if (r < 127)
r = 0;
if (r >= 192)
r = 255;
if (r <= 191 && r >= 128)
r = 4 * r - 510;
//还原绿色
bool yes;
yes = false;
if (g <= 191 && g >= 128 && (!yes))
{
g = 255;
yes = true;
}
if (g >= 192 && (!yes))
{
g = 1022 - 4 * g;
yes = true;
}
if (g <= 63 && (!yes))
{
g = 254 - 4 * g;
yes = true;
}
if (g <= 127 && g >= 67 && (!yes))
{
g = 4 * g - 257;
}
//还原蓝色分量
if (b <= 63)
b = 255;
if (b >= 128)
b = 0;
if (b >= 67 && b <= 127)
b = 510 - 4 * b;
Color colorResult = Color.FromArgb(255, r, g, b);
bmp0.SetPixel(i, j, colorResult);
}
}
Graphics panel3G = panel3.CreateGraphics();
panel3G.DrawImage(bmp0, panel3.ClientRectangle);
bmp0.Dispose();
panel3G.Dispose();
}
/// <summary>
/// 最大值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
Graphics panel2G = panel2.CreateGraphics();
bmp3 = new Bitmap(width, height);
Color color;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color = bitmap.GetPixel(i, j);
int middle = maxColor(color.R, color.G, color.B);
Color colorResult = Color.FromArgb(255, middle, middle, middle);
bmp3.SetPixel(i, j, colorResult);
}
}
panel2G.DrawImage(bmp3, panel2.ClientRectangle);
// bmp3.Dispose();
panel2G.Dispose();
}
/// <summary>
/// 加权平均
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
double r = 0.30;
double g = 0.59;
double b = 0.11;
bmp4 = new Bitmap(width, height);
Graphics panel2G = panel2.CreateGraphics();
Color color;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color = bitmap.GetPixel(i, j);
// int middle =(int) ( + g * color.G + b * color.B) / 3;
Color colorResult = Color.FromArgb(255, (int)(r * color.R), (int)(g * color.G), (int)(b * color.B));
bmp4.SetPixel(i, j, colorResult);
}
}
panel2G.DrawImage(bmp4, panel2.ClientRectangle);
// bmp4.Dispose();
panel2G.Dispose();
}
private int maxColor(int r, int g, int b)
{
if (r > g)
{
if (r > b)
{
return r;
}
else
{
return b;
}
}
else
{
if (g > b)
{
return g;
}
else
{
return b;
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (bmp3 == null)
{
MessageBox.Show("请先点击变灰按钮");
return;
}
ReDrawImage(bmp3.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));
}
private void button2_Click_1(object sender, EventArgs e)
{
if (bmp2 == null)
{
MessageBox.Show("请先点击变灰按钮");
return;
}
ReDrawImage(bmp2.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));
}
private void button6_Click(object sender, EventArgs e)
{
if (bmp4 == null)
{
MessageBox.Show("请先点击变灰按钮");
return;
}
ReDrawImage(bmp4.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));
}
button1_Click:平均值法
panel1_Paint:加载原图
ReDrawImage:灰色图像还原彩色图像
button3_Click:最大值法制作灰度图像
button4_Click:加权平均法制作灰度图像
maxColor:求颜色分量最大值
平均值方法:
最大值法:
加权平均法
本人也在学习GDI+,写得比较简单,让高手见笑了。欢迎高手给我指点
邮箱:bobui@163.com
QQ:125941562
图片灰度化处理的方法主要有三种:
最大化法。这种方法的原理是使RGB的值等于值,即:
R=G=B=max(R,G,B)
使用最大化法处理后的灰度图像的亮度很高。
平均值法。这种方法的原理是使RGB的恒等于三个色彩分量的平均值,即
R=G=B= (R+G+B)/3
使用平均值法处理后的灰度图像亮度较为柔和。
加权平均值法。 “加权”是统计学中常用的名词,这种方法是根据重要性或其他
指标给R、G、D赋于不同的权值,并位R、G、B等于它们的加权平均值。即:
R=G=B=(rR+gG+bB))/3,r、g、b分别是R、G、B的权值*权数r、g、b取不同的值时,加权平均值法能够形成不同灰度的灰度图像。由于人眼对绿色的敏感度最高,红色次之,对蓝色的敏感度最低,因此,当权值矿的时,所生成的灰度图像更符合人眼的视觉感受。通常,当r=30%,g=59%,b=11%时,这种图像的灰度较为合理。
private static Bitmap bitmap;
private int width;
private int height;
public Form1()
{
InitializeComponent();
bitmap = new Bitmap(Application.StartupPath + "\\1.jpg");
width = bitmap.Width - 1;
height = bitmap.Height - 1;
}
Bitmap bmp2;
Bitmap bmp3;
Bitmap bmp4;
private void button1_Click(object sender, EventArgs e)
{
Graphics panel2G = panel2.CreateGraphics();
bmp2 = new Bitmap(width, height);
Color color;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color = bitmap.GetPixel(i, j);
int middle = (color.R + color.G + color.B) / 3;
Color colorResult = Color.FromArgb(255, middle, middle, middle);
bmp2.SetPixel(i, j, colorResult);
}
}
panel2G.DrawImage(bmp2, panel2.ClientRectangle);
panel2G.ResetTransform();
panel2G.TranslateTransform(width, 0);
// bmp2.Dispose();
panel2G.Dispose();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics panel1G = panel1.CreateGraphics();
panel1G.DrawImage(bitmap, panel1.ClientRectangle);
panel1G.Dispose();
}
private void ReDrawImage(Bitmap bmp0)
{
Color color;
for (int i = width - 1; i >= 0; i--)
{
for (int j = height - 1; j >= 0; j--)
{
color = bmp0.GetPixel(i, j);
int r = color.R;
int g = color.G;
int b = color.B;
//还原红色
if (r < 127)
r = 0;
if (r >= 192)
r = 255;
if (r <= 191 && r >= 128)
r = 4 * r - 510;
//还原绿色
bool yes;
yes = false;
if (g <= 191 && g >= 128 && (!yes))
{
g = 255;
yes = true;
}
if (g >= 192 && (!yes))
{
g = 1022 - 4 * g;
yes = true;
}
if (g <= 63 && (!yes))
{
g = 254 - 4 * g;
yes = true;
}
if (g <= 127 && g >= 67 && (!yes))
{
g = 4 * g - 257;
}
//还原蓝色分量
if (b <= 63)
b = 255;
if (b >= 128)
b = 0;
if (b >= 67 && b <= 127)
b = 510 - 4 * b;
Color colorResult = Color.FromArgb(255, r, g, b);
bmp0.SetPixel(i, j, colorResult);
}
}
Graphics panel3G = panel3.CreateGraphics();
panel3G.DrawImage(bmp0, panel3.ClientRectangle);
bmp0.Dispose();
panel3G.Dispose();
}
/// <summary>
/// 最大值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
Graphics panel2G = panel2.CreateGraphics();
bmp3 = new Bitmap(width, height);
Color color;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color = bitmap.GetPixel(i, j);
int middle = maxColor(color.R, color.G, color.B);
Color colorResult = Color.FromArgb(255, middle, middle, middle);
bmp3.SetPixel(i, j, colorResult);
}
}
panel2G.DrawImage(bmp3, panel2.ClientRectangle);
// bmp3.Dispose();
panel2G.Dispose();
}
/// <summary>
/// 加权平均
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
double r = 0.30;
double g = 0.59;
double b = 0.11;
bmp4 = new Bitmap(width, height);
Graphics panel2G = panel2.CreateGraphics();
Color color;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
color = bitmap.GetPixel(i, j);
// int middle =(int) ( + g * color.G + b * color.B) / 3;
Color colorResult = Color.FromArgb(255, (int)(r * color.R), (int)(g * color.G), (int)(b * color.B));
bmp4.SetPixel(i, j, colorResult);
}
}
panel2G.DrawImage(bmp4, panel2.ClientRectangle);
// bmp4.Dispose();
panel2G.Dispose();
}
private int maxColor(int r, int g, int b)
{
if (r > g)
{
if (r > b)
{
return r;
}
else
{
return b;
}
}
else
{
if (g > b)
{
return g;
}
else
{
return b;
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (bmp3 == null)
{
MessageBox.Show("请先点击变灰按钮");
return;
}
ReDrawImage(bmp3.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));
}
private void button2_Click_1(object sender, EventArgs e)
{
if (bmp2 == null)
{
MessageBox.Show("请先点击变灰按钮");
return;
}
ReDrawImage(bmp2.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));
}
private void button6_Click(object sender, EventArgs e)
{
if (bmp4 == null)
{
MessageBox.Show("请先点击变灰按钮");
return;
}
ReDrawImage(bmp4.Clone(new Rectangle(0,0,width,height),PixelFormat.DontCare));
}
button1_Click:平均值法
panel1_Paint:加载原图
ReDrawImage:灰色图像还原彩色图像
button3_Click:最大值法制作灰度图像
button4_Click:加权平均法制作灰度图像
maxColor:求颜色分量最大值
平均值方法:
最大值法:
加权平均法
本人也在学习GDI+,写得比较简单,让高手见笑了。欢迎高手给我指点
邮箱:bobui@163.com
QQ:125941562
相关文章推荐
- cocos2d-x游戏实例 《简单棋》入门尝试(五) 玩家控制效果的实现
- js实例入门一(打开关闭门效果)
- Photoshop入门实例教程:透视效果…
- es6面向对象编程入门实例---鼠标移动效果
- Photoshop入门与进阶实例:1.9 滤镜效果的使用
- C#利用GDI+绘制旋转文字等效果实例
- WinformGDI+入门级实例——扫雷游戏(附源码)
- Photoshop入门与进阶实例:3.3 乳胶漆纹理效果
- GDI+入门(5、在GDI+中绘制带动画效果的图片)
- spring-boot入门实例
- Mybatis入门实例(一)
- vue-cli入门(四)——vue-resource登录注册实例
- AJAX实例:XHR的入门
- Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard
- 战30天C++入门极限-对C++中引用的补充说明(实例一)
- [Android实例] 天天动听 半透明Menu效果
- DynaForm入门教程3-基于单工步拉延分析的4个实例
- JavaScript打造很酷的图片放大效果实例代码
- Windows GDI和GDI+编程实例剖析
- ActiveMQ入门实例及与Spring集成