簡體   English   中英

g.DrawImage拋出內存不足異常

[英]g.DrawImage throws out of memory exception

在我的應用中,我正在處理大約30-70個大圖像。 通過工作,我的意思是加載,裁剪,調整大小並添加到aviStream。 每個圖像最多可以有4500p和10MB(使用如此大的圖像可以為我提供大部分的內存不足異常)。 在測試時,我有時會使用較小的內存(每個2500p〜500kB),並且內存情況要好得多。

我已將程序的體系結構更改為:加載一個圖像,處理所需的操作,將其添加到流中,然后關閉它。 然后對下一張圖片進行同樣的操作。 但是由於代碼的復雜性和大小,我不能100%確定在此過程中我是否要處置並關閉為臨時目的而創建的每個位圖和圖像。

我有以下錯誤:

An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll

通常在裁剪圖像時:

public static Image Crop(Image imgPhoto, Point xy, int width, int height) {
        Rectangle cropRect = new Rectangle(xy, new Size(width, height));
        Bitmap target = new Bitmap(cropRect.Width, cropRect.Height);

        using (Graphics g = Graphics.FromImage(target)) {
            g.DrawImage(imgPhoto, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel);
        }

        return target;
    }

根據裁剪級別引發異常,如果我裁剪大圖像的一小部分,例如在中間放置800x600像素,效果會更好。 如果以相反的方式進行裁剪,比方說,創建一個3500x2500的圖像,其中原始圖像較小(空白空間將自動填充為所選顏色),那么大多數時候我都是例外。

還有一件有趣的事情是,在第23張圖片周圍拋出了異常,因此可以很好地處理以前的圖片。

你們能給我建議如何調試嗎? 我試圖掃描代碼以查找未處理的圖像和位圖,但似乎還沒有找到所有這些圖像和位圖。

因此,最大的問題是:如何毫無例外地一張一張地處理所有圖像?

如果要在方法內部創建位圖,則必須在方法外部使用using塊,我的意思是在其中調用該方法的方式如下:

using (var myNewBitmap = Crop(imgPhoto, xy, width, height) ) 
{

// do whatever you want with the bitmap 

}

使用后它將處置,並且您不會收到異常。 使用當前代碼,您將來可能會用光內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM