我有一个采用彩色位图并使其成为灰度的功能,但内存使用率太高。之前我使用过Marshal.Copy方法,没有内存泄漏但速度较慢。有什么帮助吗?
Bitmap b = a.Clone(new Rectangle(0, 0, a.Width, a.Height), a.PixelFormat);
BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
byte bitsPerPixel = Convert.ToByte(Image.GetPixelFormatSize(bData.PixelFormat));
/*This time we convert the IntPtr to a ptr*/
byte* scan0 = (byte*)bData.Scan0.ToPointer();
//Console.WriteLine(scan0);
for (int i = 0; i < bData.Height; ++i)
{
for (int j = 0; j < bData.Width; ++j)
{
byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;
data[0] = data[1] = data[2] = (byte)((data[0] + data[1] + data[2]) / 3);
}
}
b.UnlockBits(bData);
bData = null;
return b;
答案 0 :(得分:1)
我不知道内存泄漏,但有一种更好的方法将图像转换为灰度。访问此page,您将找到三种方法,第三种方式称为“短而甜”是最快的。而且最甜蜜。
外部网站即使在谷歌和互联网档案馆的返回机器上也不可用,但是短而甜的方法的代码在另一个SO answer中给出。
答案 1 :(得分:0)
如果要直接写入C#中的内存指针,则需要使用“不安全的代码”。有关详细信息,请参阅此处的文章:
http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx