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不受支持。谢谢。这就解决了眼前的问题,但是我将把这个问题留一段时间,因为我想听听一般的调试技术。