1

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

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;
}

但是,我不断收到 OutOfMemory 异常Graphics g = Graphics.FromImage(resized)

我知道,当涉及到 GDI 时,OutOfMemory 异常通常会掩盖其他问题。我也很清楚,我要调整大小的图像并不大,而且(据我所知)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;
        }
    }
}

但现在我得到了一个 InvalidOperation 异常resized.SetResolution(orig.HorizontalResolution, orig.VerticalResolution);

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

4

1 回答 1

2

Graphics.FromImage方法定义:

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

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

于 2012-10-02T15:31:18.310 回答