2 maokaidongv587 maokaidongv587 于 2016.01.13 11:23 提问

要将一张512*512的图片转换为灰度图出了问题

图片说明
代码如下
private void memory_Click(object sender, EventArgs e)
{
if (curBitmap != null)
{
Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = curBitmap.Width * curBitmap.Height * 3;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
double colorTemp = 0;
for (int i = 0; i < rgbValues.Length; i += 3)
{
colorTemp = rgbValues[i + 2] * 0.299 + rgbValues[i + 1] * 0.587 + rgbValues[i] * 0.114;
rgbValues[i] = rgbValues[i + 1] = rgbValues[i + 2] = (byte)colorTemp;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
curBitmap.UnlockBits(bmpData);
Invalidate();
}
}
结果如下图片说明
查了半天代码也没发现问题所在,麻烦帮着指点一下

2个回答

91program
91program   Ds   Rxr 2016.01.13 12:06
已采纳

应该是你对图片数据的格式不清楚,不能使用实际的 Length
实际存贮的数据应该是 4 的倍数,具体你可以在网上查一查 BMP 图片的格式、及如何解析,有详细的说明。

maokaidongv587
maokaidongv587 发现了,图片是32位的,我按24位处理了。
接近 2 年之前 回复
lj1995091
lj1995091   2016.01.23 10:37

你用Marshal类做灰度化效率不是最高的,图稍微打点,就会有明显的延迟
你可以去学习一下ColorMetrix,颜色矩阵,可以看看这个文章,虽然不是讲灰度化的是讲透明化的,但是你要是看懂了什么颜色都能弄
http://blog.csdn.net/lj1995091/article/details/50547248

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!