Out of Memory Exception - Bitmap.Clone

时间:2015-06-07 12:03:29

标签: c#

我正在使用我在Github上找到的repo,当我尝试运行它时,我在以下函数中得到一个异常:

public Color GetPixelColor(Point pos)
{
    Color pixelColor = new Color();
    Bitmap image = new Bitmap(1, 1);
    RECT rc;
    GetWindowRect(process, out rc);
    Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
    Graphics gfxBmp = Graphics.FromImage(bmp);
    IntPtr hdcBitmap = gfxBmp.GetHdc();
    PrintWindow(process, hdcBitmap, 0);
    gfxBmp.ReleaseHdc(hdcBitmap);
    gfxBmp.Dispose();
    image = bmp.Clone(new Rectangle(pos.X, pos.Y, 1, 1), PixelFormat.Format32bppArgb);
    pixelColor = image.GetPixel(0, 0);
    return pixelColor;
}

问题在于:

image = bmp.Clone(new Rectangle(pos.X, pos.Y, 1, 1), PixelFormat.Format32bppArgb);

问题是我有两个显示器吗?有什么建议吗?

编辑:我已经将项目设置为显式构建x64,并且我有足够的系统内存。

编辑2:找到问题的根源。

有一种名为Unzoom()

的方法
while(!ColorDif.isCorrect(Home.bsProcess.image.GetPixelColor(new Point(3 + Settings.xDif,25 + Settings.yDif)), Color.FromArgb(0, 0, 0)))

设置(传递给上述代码的内容)

public static int xDif = 0, yDif = 0;

在运行时,在以下情况下抛出异常: xDif = -282 yDif = -45

2 个答案:

答案 0 :(得分:2)

Bitmap是Win32 GDI方法的包装器。这些方法的错误代码有时会被混淆地转换为.NET异常。因此,您可能没有OOM,而是其他一些GDI错误。

GDI有许多规则,WPF不是这种规则,可能会导致这样的错误。例如,元素的像素尺寸必须至少为1x1。此外,任何坐标和大小都必须有效。可能你的错误与那里的错误有关。

答案 1 :(得分:0)

您应该处理您创建的图像。如果你不这样做,你将得到OutOfMemoryException。