我有一些图像,我需要做一些原始的重新尺寸工作 - 为了这个例子的目的,我只想说我需要将给定图像的宽度和高度增加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);
}
}
答案 0 :(得分:2)
您的图形表面仅适用于原始尺寸的图像。您需要创建一个正确大小的新图像,并将其用作Graphics对象的源。
Image newImage = new Bitmap(pngImage.Width + 4, pngImage.Height+4);
Graphics g = Graphics.FromImage(newImage);
答案 1 :(得分:2)
我遇到了同样的问题。但是修复输出图形的大小并没有解决我的问题。我意识到当我在很多图像上使用代码时,我试图使用非常高的质量来绘制图像,这会消耗太多内存。
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
在对这些行进行评论之后,代码运行得非常完美。
答案 2 :(得分: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);
}
}
答案 3 :(得分: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