为什么我在c#中生成位图图像对象时会得到这个异常
本文关键字:异常 对象 图像 位图 为什么 | 更新日期: 2023-09-27 18:02:37
我对这段代码有一些问题,它只是生成一个图形位图图像(表示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。执行
现在输入参数值是70(因为它已经强制转换为UrgencyRating值和并乘以10)。
这是返回System.Drawing的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。对象到调用者的位图:
img = Image.GetInstance(ChartHelper.GetPdfChart((int)currentVuln.UrgencyRating * 10), System.Drawing.Imaging.ImageFormat.Bmp);
现在我的问题是,当回来并尝试执行前面的操作时,它给了我这个异常说:参数无效
我认为是因为你返回处置位图对象。下面的代码
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();
}