如何用C#对8位的BMP灰度图进行处理?

如题,我知道对24位真彩色的图像进行处理是用Pixel.R(或者Pixel.G/Pixel.B)和GetPixel(x,y);但是对8位的BMP灰度图该用C#里面的什么函... 如题,我知道对24位真彩色的图像进行处理是用Pixel.R(或者Pixel.G/Pixel.B)和GetPixel(x,y);
但是对8位的BMP灰度图该用C#里面的什么函数方法呢?之前只在VC里面做过图像处理,到了C#不知道该用什么函数方法了,请高人指教
展开
 我来答
royjunyu
2009-07-17 · 超过14用户采纳过TA的回答
知道答主
回答量:28
采纳率:0%
帮助的人:40.5万
展开全部
/// <summary>
/// 灰度
/// </summary>
/// <param name="b">原始图</param>
/// <param name="mode">模式(true:加权模式, false:平均模式)</param>
/// <returns></weightingMode>
public static Bitmap ToGray(Bitmap b, bool weightingMode)
{
if (b == null) return null;

try
{

int width = b.Width;
int height = b.Height;

BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * 3;
byte gray = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (weightingMode) // 加权平均
{
gray = (byte)((float)p[0] * 0.114f + (float)p[1] * 0.587f + (float)p[2] * 0.299f);
}
else // 算数平均
{
gray = (byte)((float)(p[0] + p[1] + p[2]) / 3.0f);
}
p[0] = (byte)gray;
p[1] = (byte)gray;
p[2] = (byte)gray;

p += 3;
} // x
p += offset;
} // y
}

b.UnlockBits(data);

return b;
}
catch
{
return null;
}
}
这里用指针直接操作内存,编译时需要选中“允许不安全代码”,但这样做的运行速度要快得多。另外参数“模式”中“加权模式”是根据人眼对不同颜色的敏感程度,乘以不同的权重系数后再取平均值,而平均模式就是简单取三原色的平均值,两者的显示效果没有太大的区别。这个函数是我以前在网上找来的,稍微改了一点点,不过不记得出自哪了...
百度网友e2bfe8b
2009-07-11 · TA获得超过616个赞
知道小有建树答主
回答量:242
采纳率:0%
帮助的人:180万
展开全部
(R+G+B)/3
赋给他。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式