为什么我在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);

现在我的问题是,当回来并尝试执行前面的操作时,它给了我这个异常说:参数无效

为什么我在c#中生成位图图像对象时会得到这个异常

我认为是因为你返回处置位图对象。下面的代码

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();
    }