我正试图在另一张图片上放置一个水印。这是我的代码:
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 :(得分:3)
检查绑定区域的大小。在你的情况下,这将是新的矩形(point.X,point.Y,imgWatermark.Width,imgWatermark.Height)。我有同样的“内存不足”问题,原因是我的绑定区域大于我的纹理大小。
答案 1 :(得分:1)
此外,当从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!
答案 2 :(得分:0)
您应该在using
语句中包含IDisposable
个资源,以确保尽快妥善处理。另外,不要期望能够对大于内存容量的文件执行Image.FromFile
。
答案 3 :(得分:0)
我愿意打赌filePath
的档案相当大。
OutOfMemoryException
,所以在这里你可能正在尝试加载一个比运行时中任何可用内存块都大的文件。
尝试压缩图像文件,或者如果可以接受的话,裁剪它以使其变小。
修改强> 尝试在图像编辑器(如MS Paint或Paint.NET)中打开文件。然后重新保存。
如果这不起作用,请尝试这个(基本上确保矩形的边界在水印图像内): http://www.owenpellegrin.com/blog/net/out-of-memory-errors-with-gdi-texturebrush/