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

C# 如何调试误导性的GDI OutOfMemory异常?,c#,debugging,gdi,out-of-memory,invalidoperationexception,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.VerticalResolu

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

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(已调整大小)
上,我不断发现内存异常

我知道。我还非常清楚,我试图调整大小的图像不是很大,而且(据我所知)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操作问题?

来自
图形。来自image
方法定义:

如果图像具有索引像素格式,此方法将引发异常,并显示以下消息:“无法从具有索引像素格式的图像创建图形对象。”


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

只是想知道-您正在尝试在ASP.NET应用程序中使用GDI+吗?我们这样做了一段时间,直到我们发现它不受支持并且会崩溃(有时)。@Garetohen不,这是一个winforms应用程序。只需检查-
Format16bppGrayScale
就被认为是索引像素格式?是的,所有灰度图像实际上都有索引格式,带有灰度调色板(0,0,0),(1,1,1)。。。Graphics.FromImage MSDN主题中提到Format16bppGrayScale不受支持。谢谢。这就解决了眼前的问题,但是我将把这个问题留一段时间,因为我想听听一般的调试技术。