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