如何调试误导性的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 +位图。