3

我有一些图像需要做一些粗略的调整大小的工作——为了这个例子的目的,假设我需要将给定图像的宽度和高度增加 4 个像素。我不确定为什么对 Graphics.DrawImage() 的调用会引发 OOM——这里的任何建议将不胜感激。

class Program
{
    static void Main(string[] args)
    {
        string filename = @"c:\testImage.png";

        // Load png from stream
        FileStream fs = new FileStream(filename, FileMode.Open);
        Image pngImage = Image.FromStream(fs);
        fs.Close();

        // super-hacky resize
        Graphics g = Graphics.FromImage(pngImage);
        g.DrawImage(pngImage, 0, 0, pngImage.Width + 4, pngImage.Height + 4); // <--- out of memory exception?!

        // save it out
        pngImage.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
    }
}
4

4 回答 4

4

我只是有同样的问题。但是修复输出图形的大小并没有解决我的问题。我意识到我尝试使用非常高质量的图像来绘制图像,当我在大量图像上使用代码时会消耗太多内存。

g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;

在注释掉这些行之后,代码运行良好。

于 2014-12-26T23:17:34.200 回答
2

您的 Graphics 表面仅足以容纳原始大小的图像。您需要创建正确大小的新图像并将其用作 Graphics 对象的源。

Image newImage = new Bitmap(pngImage.Width + 4, pngImage.Height+4);
Graphics g = Graphics.FromImage(newImage);
于 2013-03-15T17:27:25.343 回答
1

这可能无法完成您想做的事情,因为图像的大小与 指定的大小相同FromImage,而是可以使用Bitmap该类:

using (var bmp = new Bitmap(fileName))
{
    using (var output = new Bitmap(
        bmp.Width + 4, bmp.Height + 4, bmp.PixelFormat))
    using (var g = Graphics.FromImage(output))
    {
        g.DrawImage(bmp, 0, 0, output.Width, output.Height);

        output.Save(outFileName, ImageFormat.Png);
    }
}
于 2013-03-15T17:31:38.880 回答
0

你能试试这个修复吗?

    class Program
    {
        static void Main(string[] args)
        {
            string filename = @"c:\testImage.png";

            // Load png from stream
            FileStream fs = new FileStream(filename, FileMode.Open);
            Image pngImage = Image.FromStream(fs);
            fs.Close();

            // super-hacky resize
            Graphics g = Graphics.FromImage(pngImage);
            pngImage = pngImage.GetThumbnailImage(image.Width, image.Height, null, IntPtr.Zero);
            g.DrawImage(pngImage, 0, 0, pngImage.Width + 4, pngImage.Height + 4); // <--- out of memory exception?!

            // save it out
            pngImage.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
        }
    }

受此问题启发:Help to resolve 'Out of memory' exception when calling DrawImage

于 2013-03-15T17:28:40.410 回答