首先解释下所谓的黑白图片。其实更准确地应该叫256级灰度图。当一个颜色点的R=G=B时,就是我们所谓的“灰色”。由于RGB的取值范围在[0,255],所以一共只有256种可能。
所以彩色图片转为黑白图片的原理非常简单。只要扫描彩图的每一点,让输出图对应点的R=G=B就成了。现在问题的关键就是如何取值了。
一般有两种,一种是彩图RGB三分量的算数平均值,另一种是加权平均值。加权平均是考虑到人类眼睛对不同分量的敏感程度。
具体代码如下:
/**////<summary>
///变成黑白图
///</summary>
///<paramname="bmp">原始图</param>
///<paramname="mode">模式。0:加权平均1:算数平均</param>
///<returns></returns>
privateBitmapToGray(Bitmapbmp,intmode)
...{
if(bmp==null)
...{
returnnull;
}
intw=bmp.Width;
inth=bmp.Height;
try
...{
bytenewColor=0;
BitmapDatasrcData=bmp.LockBits(newRectangle(0,0,w,h),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
unsafe
...{
byte*p=(byte*)srcData.Scan0.ToPointer();
for(inty=0;y<h;y++)
...{
for(intx=0;x<w;x++)
...{
if(mode==0)//加权平均
...{
newColor=(byte)((float)p[0]*0.114f+(float)p[1]*0.587f+(float)p[2]*0.299f);
}
else//算数平均
...{
newColor=(byte)((float)(p[0]+p[1]+p[2])/3.0f);
}
p[0]=newColor;
p[1]=newColor;
p[2]=newColor;
p+=3;
}
p+=srcData.Stride-w*3;
}
bmp.UnlockBits(srcData);
returnbmp;
}
}
catch
...{
returnnull;
}
}