内存不足异常-位图.克隆

本文关键字:克隆 -位图 异常 内存不足 | 更新日期: 2023-09-27 17:53:53

我正在使用我在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)))

Settings(传递给上面代码的内容)

public static int xDif = 0, yDif = 0;

在运行时,当:xDif = -282yDif = -45

内存不足异常-位图.克隆

Bitmap是Win32 GDI方法的包装器。来自这些方法的错误代码有时会有些令人困惑地转换成。net异常。因此,您可能没有OOM,而是其他一些GDI错误。

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

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