【问题标题】:GDI+ Bitmap Disposal and Invalid Parameter ErrorsGDI+ 位图处理和无效参数错误
【发布时间】:2019-04-12 03:08:14
【问题描述】:

我正在编写一个应用程序来使用一些中间位图为我绘制一些图像,但是如果我之前处理用于调整图像大小的中间位图,我会从 GDI+(图形类)收到无效参数错误绘制位图。

应用程序本身旨在获取输入图像并将其裁剪并调整大小后输出为图像文件。现在这意味着在某个时间点,调整大小的图像存储在中间位图中。调整大小完成后,中间位图被分配给原始位图,然后使用 GDI+ 进行绘制,中间位图被处理掉。但是由于某种原因,如果在重新绘制原始图像之前处理掉了中间体(尽管它的值被分配给另一个变量并且理论上不需要),程序会抛出一个无效参数错误,我很好奇为什么。

此版本抛出无效参数错误

using system.drawing;
Bitmap Background = new Bitmap(*filepath*);
Bitmap Image = new Bitmap(*another filepath*);
Bitmap ResizedImage = new Bitmap(825, 1125);
...Some code that clips and resizes Image and draws it onto ResizedImage...
Image = ResizedImage;
ResizedImage.Dispose();
using(Graphics g = Graphics.FromImage(Background)
{
  g.DrawImage(Image, 0, 0, 825, 1125);
}

但是这个版本没有,只有一行的位置改变

using system.drawing;
Bitmap Background = new Bitmap(*filepath*);
Bitmap Image = new Bitmap(*another filepath*);
Bitmap ResizedImage = new Bitmap(825, 1125);
...Some code that clips and resizes Image and draws it onto ResizedImage...
Image = ResizedImage;
using(Graphics g = Graphics.FromImage(Background)
{
  g.DrawImage(Image, 0, 0, 825, 1125);
  ResizedImage.Dispose();
}

由于 ResizedImage 在处理之前已将其内容复制到 Image 中,因此 Image 应该可以正常绘制,但如果我使用代码的第一位,我会收到无效参数错误,我只是想知道原因。我猜这与位图分配的方式有关

【问题讨论】:

    标签: c# bitmap gdi+


    【解决方案1】:

    这是你的问题

    Image = ResizedImage;
    

    Bitmap 是一个引用类型,此时ImageResizedImage 都指向同一个内存位。原来的Image丢了,变成了内存泄漏

    然后您在ResizedImage 上调用Dispose(),这与现在的Image 相同reference (ResizedImage == Image)

    ResizedImage.Dispose();
    

    然后尝试再次使用它(记住Image 是已处置的ResizedImage

    g.DrawImage(Image, 0, 0, 825, 1125);
    

    简而言之,不要这样做Image = ResizedImage;,也要使用using语句

    【讨论】:

    • 嗯,好吧,这确实与作业的工作方式有关。我想我最好看看我如何能堵住内存泄漏但保持功能。 (代码包含在一些 using 语句中,但我可能需要添加更多)
    • 那么使用 .clone 之类的方法可以解决内存泄漏问题吗?即在同一个位图对象上进行所有裁剪和调整大小,而不是制作另一个,例如:Image = Image.Clone(cropped rectangle, etc)
    • @NeoEyes 据我所知,您只需要使用 ResisedImage 作为您的绘图图像。这样你就可以自然地处理 Image
    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 2014-07-11
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多