问题描述
- 要将一张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();
}
}
结果如下
查了半天代码也没发现问题所在,麻烦帮着指点一下
解决方案
应该是你对图片数据的格式不清楚,不能使用实际的 Length
实际存贮的数据应该是 4 的倍数,具体你可以在网上查一查 BMP 图片的格式、及如何解析,有详细的说明。
解决方案二:
你用Marshal类做灰度化效率不是最高的,图稍微打点,就会有明显的延迟
你可以去学习一下ColorMetrix,颜色矩阵,可以看看这个文章,虽然不是讲灰度化的是讲透明化的,但是你要是看懂了什么颜色都能弄
http://blog.csdn.net/lj1995091/article/details/50547248
时间: 2024-08-06 21:46:11