C# 使用指针时内存使用过度?

C# 使用指针时内存使用过度?,c#,pointers,bitmap,C#,Pointers,Bitmap,我有一个函数,它接受一个彩色位图,并使其灰度化,但内存使用率太高。我以前使用过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.R

我有一个函数,它接受一个彩色位图,并使其灰度化,但内存使用率太高。我以前使用过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;
Bitmap b=a.Clone(新矩形(0,0,a.宽度,a.高度),a.像素格式);
BitmapData bData=b.LockBits(新矩形(0,0,b.宽度,b.高度),ImageLockMode.ReadWrite,b.像素格式);
字节bitsPerPixel=Convert.ToByte(Image.GetPixelFormatSize(bData.PixelFormat));
/*这次我们将IntPtr转换为ptr*/
字节*scan0=(字节*)bData.scan0.ToPointer();
//控制台写入线(scan0);
对于(int i=0;i
我不知道内存泄漏,但有一种更好的方法可以将图像转换为灰度。访问此网站,您将发现三种方法,第三种方法称为“短而甜”是最快的。而且最甜


外部站点即使在Google和Internet Archive的wayback机器中也不可用,但另一个机器中给出了简短和甜蜜方法的代码。

我不知道内存泄漏,但有更好的方法将图像转换为灰度。访问此网站,您将发现三种方法,第三种方法称为“短而甜”是最快的。而且最甜


外部站点即使在Google和Internet Archive的wayback机器中也不可用,但short and sweet方法的代码在另一个机器中给出。

如果你想从C#中直接写入内存指针,你需要使用“不安全代码”。有关更多信息,请参阅此处的文章:


如果要从C#中直接写入内存指针,需要使用“不安全代码”。有关更多信息,请参阅此处的文章:


如何测量内存使用情况?使用任务管理器,不是最好的方法,但它确实表明内存没有被释放。如何测量内存使用情况?使用任务管理器,不是最好的方法,但它确实表明内存没有被释放。你是指检查“使用不安全代码”并指定“不安全”,是的,我是指检查“使用不安全代码”并指定“不安全”,是的,我这样做了。谢谢。我会研究这样做的。谢谢。我会研究那样做的。