2013-03-15 81 views
2

我有一些图像,我需要做一些粗糙的重新大小的工作 - 对于这个例子的目的,让我们只是说我需要增加宽度和高度一个给定的图像4个像素。 我不确定为什么要调用Graphics.DrawImage()抛出一个OOM - 任何建议在这里将不胜感激。Graphics.DrawImage() - 抛出内存异常

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); 
    } 
} 
+0

您可以在基于原始图像的'Graphics'对象中绘制较大的图像吗? – FlyingStreudel 2013-03-15 17:27:54

回答

2

您的图形表面仅适合原始大小的图像。您需要创建一个正确大小的新图像,并将其用作Graphics对象的源。

Image newImage = new Bitmap(pngImage.Width + 4, pngImage.Height+4); 
Graphics g = Graphics.FromImage(newImage); 
+0

你能解释一下+4吗? – Pangamma 2017-08-07 07:14:56

+0

@Pangamma问题是关于将图像的宽度和高度增加4个像素,因此+4。 – jlew 2017-08-09 20:15:50

+0

Ahhhh哇。 Ahaha。 @Jeff是的,那将是原因。谢谢。我不相信我错过了。 – Pangamma 2017-08-10 15:33:19

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

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); 
    } 
} 
+0

说真的,+4是什么东西? – Pangamma 2017-08-07 07:15:58

2

我刚刚有同样的问题。不过,修复输出Graphics的大小并不能解决我的问题。我意识到,当我在很多图像上使用代码时,我试图使用非常高的质量来绘制消耗太多内存的图像。

g.CompositingQuality = CompositingQuality.HighQuality; 
g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
g.SmoothingMode = SmoothingMode.HighQuality; 
出来的代码非常完美注释这些行后