[英]TextureBrush Out of Memory Exception
我正在尝试在另一张图像上放置水印。 这是我的代码:
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尝试完成其工作之前,没有任何处理。
检查您的装订区域的大小。 在您的情况下,这将是新的Rectangle(point.X,point.Y,imgWatermark.Width,imgWatermark.Height) 。 我遇到同样的“内存不足”问题,原因是绑定区域大于纹理大小。
同样,当处理了从中加载了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!
您应该在using
语句中包装IDisposable
资源,以确保尽快进行适当处理。 也不要期望能够对大于内存的文件执行Image.FromFile
。
我敢打赌, filePath
上的文件很大。
当您有.NET堆碎片时,通常会发生OutOfMemoryException
,因此在这里您可能试图加载大于运行时中任何可用内存块的文件。
尝试压缩图像文件,或将其裁剪以使其较小(如果可以接受的话)。
编辑尝试在图像编辑器(例如MS Paint或Paint.NET)中打开文件。 然后重新保存。
如果这不起作用,请尝试以下操作(基本上确保矩形的边界在水印图像内): http : //www.owenpellegrin.com/blog/net/out-of-memory-errors-with-gdi-texturebrush /
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.