【问题标题】:excessive memory usage when using pointers?使用指针时内存使用过多?
【发布时间】:2010-11-20 09:26:39
【问题描述】:

我有一个函数可以获取彩色位图并使其变为灰度,但内存使用率太高了。我之前使用了 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;

【问题讨论】:

  • 你如何衡量内存使用情况?
  • 用任务管理器,不是最好的方法,但它确实表明内存没有被释放。

标签: c# pointers bitmap


【解决方案1】:

我不知道内存泄漏,但有更好的方法将图像转换为灰度。访问此page,您会找到三种方法,其中第三种方法称为“Short and Sweet”是最快的。最甜蜜的。

即使在谷歌和 Internet Archive 的 Wayback 机器中也无法访问外部站点,但在另一个 SO answer 中给出了简短而甜蜜的方法的代码。

【讨论】:

  • 谢谢。我会考虑这样做。
【解决方案2】:

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

http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

【讨论】:

  • 你的意思是检查“使用不安全代码”并指定“不安全”,是的,我做到了
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多