我正在编写一个使用一些中间位图为我绘制一些图像的应用程序,但是如果我处置了中间位图之前用于调整图像大小的信息,则会从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();
}
由于ResizeImage在处理之前已将其内容复制到Image中,因此Image应该可以正常绘制,但是如果我使用第一行代码,而我只是想知道为什么,则会收到无效的参数错误。我猜想这与我不知道的位图分配实际上的工作方式有关,但是我非常赞赏一些明智的建议。
答案 0 :(得分:0)
这是您的问题
Image = ResizedImage;
Bitmap
是引用类型,此时Image
和ResizedImage
都指向相同的内存位。原始的Image
丢失并成为内存泄漏
然后您在Dispose()
上调用ResizedImage
,现在与Image
(ResizedImage == Image
)相同 reference
ResizedImage.Dispose();
然后尝试再次使用它(记住Image
是被处置的ResizedImage
)
g.DrawImage(Image, 0, 0, 825, 1125);
简而言之,不要执行Image = ResizedImage;
,也要使用using
语句