繁体   English   中英

TextureBrush内存不足异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM