如何调试误导性的GDI OutOfMemoryexception?

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

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)上获得OutOfMemoryexception。

我知道, 当谈到GDI时,OutOfMemoryexception通常会掩盖其他问题 。 我也非常清楚我想要resize的图像并不大(据我所知)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);上得到了一个InvalidOperationexceptionresized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);

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

来自Graphics.FromImage方法定义:

如果图像具有索引像素格式,则此方法会抛出exception,并显示消息“无法从具有索引像素格式的图像创建图形对象”。

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