- 图像处理常用类
Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下: GetPixel方法和SetPixel方法,获取和设置一个图像的指定像素的颜色。
PixelFormat属性,返回图像的像素格式。
Palette属性,获取或折纸图像所使用的颜色调色板。
Height属性和Width属性,返回图像的高度和宽度。
LockBits方法和UnlockBits方法,分别锁定和解锁系统内存中的位图像素。
BitmapData对象指定了位图的属性:
Height属性,被锁定位图的高度。
Width属性,被锁定位图的宽度。
PixelFormat属性,数据的实际像素格式。
Scan0属性,被锁定数组的首字节地址。
Stride属性,步幅,也称扫描宽度。
Graphics类提供了对象绘制到现实设备的方法。
创建Graphics对象的方法如下:
// Create image.
Image imageFile = Image.FromFile("SampImag.jpg");
// Create graphics object for alteration.
Graphics newGraphics = Graphics.FromImage(imageFile);
Graphics常用方法:
Clear(Color) 清除整个绘图面并以指定背景色填充。
Dispose() 释放此 Graphics 使用的所有资源。
DrawIcon(Icon, Int32, Int32) 在指定坐标处绘制由指定的 Icon 表示的图像。
DrawIcon(Icon, Rectangle) 在 Icon 结构指定的区域内绘制指定的 Rectangle 表示的图像。
DrawImage(Image, Int32, Int32) 在由坐标对指定的位置,使用图像的原始物理大小绘制指定的图像。
Graphics属性:
DpiX属性, 获取Graphics的水平分辨率。
DpiY属性,获取Graphics的垂直分辨率。
Transform属性,获取或设置此Graphics的几何世界转换的副本。
TextContrast属性,获取或设置文本的灰度校正值。
详细请见:https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.graphics?view=netframework-4.7.2
2. 彩色图像灰度化
24位彩色图像每个像素用3个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝)。当3个分量不想同时表现为 灰度图像。转化方式:
平均法:将同一像素位置3个通道RGB的值进行平均
Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3
Gray(i,j)为转换后的灰度图像在(i,j)点出的灰度值。由于人眼对颜色的感应不同,有了以下的转化为方式:
Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.114*B(i,j)
Gray(i,j)=G(i,j)
图像处理的3种方法为:
使用Bitmap.GetPixel()和Bitmap.SetPixel()
- 提取像素法
/// 图像灰度化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Image imageFile = (Bitmap)Image.FromFile(@"C:\Users\Administrator.USER-20151012WY\Desktop\WaterMarkTool\xiaowanzi.jpg");
Bitmap newbitmap = imageFile as Bitmap;
Graphics g = Graphics.FromImage(newbitmap);
Color pixel;
int ret = 0;
for (int x = 0; x < newbitmap.Width; x++)
{
for (int y = 0; y < newbitmap.Height; y++)
{
pixel = newbitmap.GetPixel(x, y);
//ret = (int)(pixel.R * 0.299 + pixel.G * 0.587 + pixel.B * 0.114);
ret = (pixel.R + pixel.G + pixel.B) / 3;
newbitmap.SetPixel(x, y, Color.FromArgb(ret, ret, ret));
}
}
g.DrawImage(newbitmap, 0, 0);
this.pictureBox2.Image = newbitmap;
g.Dispose();
}
- 指针法
通过LockBits方法来获取位图的首地址, 该方法简单,直接用指针进行位图操作。所以对内存的操作需要unsafe下进行操作。
为了保持类型安全,在默认情况下,C#是不支持指针运算的,因为使用指针会带来相关的风险。所以C#只允许在特别标记的代码块中使用指针。通过使用unsafe关键字,可以定义可使用指针的不安全上下文。
- 内存法
该方法就是指图像数据直接复制到内存中,这样就使程序的运行速度大大提高。
3. 转化为灰度方法
浮点算法:Gray=R*0.3+G*0.59+B*0.11
整数算法:Gray=(R*30+G*59+B*11)/100
移位算法:Gray=(R*28+G*151+B*77)>>8
平均值法:Gray=(R+G+B)/3
仅取绿色:Gray=G
灰度是指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,因此黑白图片也称为灰度图像。