我有一个调整位图大小的函数。这是一个“面包和黄油”操作,我只是从另一个项目中复制它:
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);
我厌倦了在黑暗中探索。有没有更好的方法来解决这些讨厌的GDI操作?
答案 0 :(得分:2)
来自Graphics.FromImage
方法定义:
如果图像具有索引像素格式,则此方法会引发消息异常,"无法从具有索引像素格式的图像创建图形对象。"
虽然您获得的异常确实具有误导性,但您正在尝试执行不受支持的操作。看起来您需要将此位图的大小调整为原始内存块,而不是GDI +位图。