簡體   English   中英

為什么我會在C#中生成此異常以生成位圖圖像對象?

[英]Why I obtain this exception generating a Bitmap image object in C#?

我在此代碼中存在一些問題,這些代碼僅生成圖形位圖圖像(表示PDF內的圖表,但這並不重要)

我有以下情況:在名為PdfVulnerability的類中,我執行此語句

if (currentVuln.UrgencyRating > 0)
{
    img = Image.GetInstance(ChartHelper.GetPdfChart((int)currentVuln.UrgencyRating * 10), System.Drawing.Imaging.ImageFormat.Bmp);
    vulnerabilityDetailsTable.AddCell(new PdfPCell(img) { Border = PdfPCell.RIGHT_BORDER, BorderColor = new BaseColor(79, 129, 189), BorderWidth = 1, Padding = 5, MinimumHeight = 30, PaddingTop = 10 });
}

currentVuln.UrgencyRating屬性的值為7.5,因此調試器將輸入if主體並嘗試執行以下行:

img = Image.GetInstance(ChartHelper.GetPdfChart((int)currentVuln.UrgencyRating * 10), System.Drawing.Imaging.ImageFormat.Bmp);

因此,使用調試器,我進入了ChartHelper.GetPdfChart((int)currentVuln.UrgencyRating * 10)執行。

現在,輸入的擬聚值是70 (因為已將其轉換為int UrgencyRating值並將其乘以10)。

這是返回System.Drawing.Image對象的GetPdfChart()方法的主體:

public static System.Drawing.Image GetPdfChart(int percentage)
    {
        if (percentage == 0)
        {
            return null;
        }

        int WIDTH = 130;
        int HEIGHT = 10;

        using (Bitmap bitmap = new Bitmap(WIDTH, HEIGHT))
        {
            using (Graphics graphics = Graphics.FromImage(bitmap))
            {
                using (LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, WIDTH, HEIGHT), Color.LightGreen, Color.Red, LinearGradientMode.Horizontal))
                {
                    graphics.FillRectangle(brush, new Rectangle(0, 0, WIDTH, HEIGHT));

                    using (Bitmap target = new Bitmap(WIDTH * percentage / 100, HEIGHT))
                    {
                        Rectangle cropped = new Rectangle(0, 0, WIDTH, HEIGHT);

                        using (Graphics g = Graphics.FromImage(target))
                        {
                            g.DrawImage(bitmap, new Rectangle(0, 0, cropped.Width, cropped.Height), cropped, GraphicsUnit.Pixel);
                            //g.Save();
                            //String filename = Path.GetTempFileName() + ".png";
                            //target.Save(filename);
                            //return filename;

                            return bitmap;
                        }
                    }
                }
            }
        }
    }

此方法可以正常工作,並將System.Drawing.Bitmap對象返回給調用者,該對象為:

img = Image.GetInstance(ChartHelper.GetPdfChart((int)currentVuln.UrgencyRating * 10), System.Drawing.Imaging.ImageFormat.Bmp);

現在我的問題是,當返回並嘗試執行上一個操作時,它給了我這個例外 ,說: 參數無效。

我認為是因為您返回了已處置的Bitmap對象。 以下代碼

using (Bitmap bitmap = new Bitmap(WIDTH, HEIGHT)) {
   // ... some code 
   return bitmap;
}

等於

try {
 Bitmap bitmap = new Bitmap(WIDTH, HEIGHT);
 return bitmap;
} finally {
   if (bitmap != null)
        bitmap.Dispose();    
}

圖像將在返回之前被處理。 一種可能的解決方案是對創建的位圖進行深拷貝,以便處置舊的位圖:

using (Bitmap bitmap = new Bitmap(WIDTH, HEIGHT)) {
       // ... some code 
       return (Image)bitmap.Clone();
    }

暫無
暫無

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

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