切他中路
2016-01-13 03:23
采纳率: 66.7%
浏览 3.0k

要将一张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 2016-01-13 04:06
    已采纳

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

    打赏 评论
  • Yentre 2016-01-23 02:37

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

    打赏 评论

相关推荐 更多相似问题