2012-06-19 102 views
1

我想放置另一个图像的水印ontop。这是我的代码:但是发生TextureBrush内存不足异常

var imgPhoto = Image.FromFile(filePath); 
var grPhoto = Graphics.FromImage(imgPhoto); 

var point = new Point(imgPhoto.Width - imgWatermark.Width, imgPhoto.Height - imgWatermark.Height); 

var brWatermark = new TextureBrush(imgWatermark, new Rectangle(point.X, point.Y, imgWatermark.Width, imgWatermark.Height)); 

grPhoto.FillRectangle(brWatermark, new Rectangle(point, imgWatermark.Size)); 
imgPhoto.Save(outputFolder + @"\" + filename); 

一个问题时,的TextureBrush抛出内存溢出异常。我搜索了四周,但我无法找到一个好的解决方案。据我所知,在TextureBrush试图完成它的工作之前,什么都没有处理。

回答

0

我敢打赌,filePath的文件相当大。

OutOfMemoryException 当你有.NET堆碎片时,通常会发生这种情况,所以在这里你可能试图加载一个大于运行系统中任何可用内存块的文件。

尝试压缩您的图像文件,或裁剪它,使其更小,如果这是可以接受的。

编辑 尝试在图像编辑器(如MS Paint或Paint.NET)中打开文件。然后重新保存它。

如果还是不行,请尝试以下(基本上确保你的矩形的界限是水印图像内): http://www.owenpellegrin.com/blog/net/out-of-memory-errors-with-gdi-texturebrush/

+0

图片大约800kb,filePath只是一个小字符串。我不认为这可能是问题。令人遗憾的是压缩或裁剪是不可接受的。 – MrZunz

+0

然后它是'imgWatermark'。什么样的文件是'imgWatermark',它有多大? –

+0

这是一个大小为3.91 KB的.png文件。不是那么大... – MrZunz

0

您应该在using声明中包含IDisposable资源,以确保尽快妥善处置。另外,不要指望能够对大于内存容量的文件执行Image.FromFile

3

检查您绑定的区域的大小。在你的情况下,这将是新的矩形(point.X,point.Y,imgWatermark.Width,imgWatermark.Height)。我有同样的“内存不足”问题,原因是我的绑定区域大于我的纹理大小。

0

此外,当从Image加载的流已被丢弃时,可能会发生这种情况。如果您计划创建纹理画笔,请尽量避免处理图像流。例如,这将工作:

var bytes = File.ReadAllBytes("image.bmp"); 
System.Windows.Controls.Image image = null; 
using (var stream = System.IO.MemoryStream(bytes)) 
{ 
    image = System.Windows.Controls.Image.FromStream(stream); 
    var brush = new System.Drawing.TextureBrush(image); // No issues 
} 

但是,处理流的错误几乎相同的事情会产生该异常。

var bytes = File.ReadAllBytes("image.bmp"); 
System.Windows.Controls.Image image = null; 
using (var stream = System.IO.MemoryStream(bytes)) 
{ 
    image = System.Windows.Controls.Image.FromStream(stream); 
} 
var brush = new System.Drawing.TextureBrush(image); // Exception Thrown!