GDI+ 位图处理和无效参数错误
GDI+ Bitmap Disposal and Invalid Parameter Errors
我正在编写一个应用程序来使用一些中间位图为我绘制一些图像,但是如果我处理正在使用的中间位图,我会收到来自 GDI+(图形 class)的无效参数错误用于在绘制位图之前调整图像大小。
该应用程序本身旨在获取输入图像并将其裁剪并调整大小后输出为图像文件。现在这意味着在某个时间点,调整大小的图像存储在中间位图中。当调整大小完成后,中间位图被分配给原始位图,然后用 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 应该可以很好地绘制,但是如果我使用第一段代码,我会收到无效参数错误,我只是想知道为什么。我猜这与位图分配 实际上 的工作方式有关,我不知道,但非常感谢一些更明智的建议。
这是你的问题
Image = ResizedImage;
Bitmap
是一个引用类型,此时Image
和ResizedImage
都指向同一个内存位。原来的Image
丢了,变成了内存泄漏
然后您在 ResizedImage
上调用 Dispose()
,这与现在 Image
相同 reference (ResizedImage == Image
)
ResizedImage.Dispose();
然后尝试再次使用它(记住 Image
是已处理的 ResizedImage
)
g.DrawImage(Image, 0, 0, 825, 1125);
总之不要这样Image = ResizedImage;
,也用using
语句
我正在编写一个应用程序来使用一些中间位图为我绘制一些图像,但是如果我处理正在使用的中间位图,我会收到来自 GDI+(图形 class)的无效参数错误用于在绘制位图之前调整图像大小。
该应用程序本身旨在获取输入图像并将其裁剪并调整大小后输出为图像文件。现在这意味着在某个时间点,调整大小的图像存储在中间位图中。当调整大小完成后,中间位图被分配给原始位图,然后用 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 应该可以很好地绘制,但是如果我使用第一段代码,我会收到无效参数错误,我只是想知道为什么。我猜这与位图分配 实际上 的工作方式有关,我不知道,但非常感谢一些更明智的建议。
这是你的问题
Image = ResizedImage;
Bitmap
是一个引用类型,此时Image
和ResizedImage
都指向同一个内存位。原来的Image
丢了,变成了内存泄漏
然后您在 ResizedImage
上调用 Dispose()
,这与现在 Image
相同 reference (ResizedImage == Image
)
ResizedImage.Dispose();
然后尝试再次使用它(记住 Image
是已处理的 ResizedImage
)
g.DrawImage(Image, 0, 0, 825, 1125);
总之不要这样Image = ResizedImage;
,也用using
语句