如何调试误导性的GDI OutOfMemory异常?

时间:2012-10-02 15:21:19

标签: c# debugging gdi out-of-memory invalidoperationexception

我有一个调整位图大小的函数。这是一个“面包和黄油”操作,我只是从另一个项目中复制它:

private Bitmap ResizeBitmap(Bitmap orig)
{
    Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale);
    resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
    using (Graphics g = Graphics.FromImage(resized))
    {
        g.DrawImage(orig, 0, 0, resized.Width, resized.Height);
    }
    return resized;
}

但是,我一直在Graphics g = Graphics.FromImage(resized)上获得OutOfMemory例外。

我知道,when it comes to GDI, OutOfMemory exceptions usually mask other problems。我也非常清楚我正在尝试调整大小的图像并不大(据我所知)GC在离开当前范围时收集实例应该没有问题。

无论如何,我现在已经玩了一段时间,现在看起来像这样:

private Bitmap ResizeBitmap(Bitmap orig)
{
    lock(orig)
    {
        using (Bitmap resized = new Bitmap(this.Xsize, this.Ysize, PixelFormat.Format16bppGrayScale))
        {
            resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);
            using (Graphics g = Graphics.FromImage(resized))
            {
                g.DrawImage(orig, 0, 0, resized.Width, resized.Height);
            }
            return resized;
        }
    }
}

但现在我在resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);

上收到了InvalidOperation异常

我厌倦了在黑暗中探索。有没有更好的方法来解决这些讨厌的GDI操作?

1 个答案:

答案 0 :(得分:2)

来自Graphics.FromImage方法定义:

  

如果图像具有索引像素格式,则此方法会引发消息异常,"无法从具有索引像素格式的图像创建图形对象。"

虽然您获得的异常确实具有误导性,但您正在尝试执行不受支持的操作。看起来您需要将此位图的大小调整为原始内存块,而不是GDI +位图。