2

我正在尝试在另一个图像上放置水印。这是我的代码:

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 尝试完成其工作之前,什么都没有处理。

4

4 回答 4

4

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!
于 2017-12-01T22:58:17.097 回答
3

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

于 2012-11-27T05:14:42.573 回答
0

IDisposable您应该将资源包装在using语句中,以确保尽快正确处理。也不要期望能够对Image.FromFile大于内存容量的文件执行操作。

于 2012-06-19T09:39:08.837 回答
0

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

OutOfMemoryException通常在您有 .NET 堆碎片时发生,因此您可能正在尝试加载一个大于运行时中任何可用内存块的文件。

尝试压缩您的图像文件,或者在可以接受的情况下将其裁剪以使其更小。

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

如果这不起作用,试试这个(基本上确保你的矩形边界在水印图像内): http ://www.owenpellegrin.com/blog/net/out-of-memory-errors-with-gdi-texturebrush /

于 2012-06-19T09:40:05.380 回答