2012-06-19 105 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!