GDI +位图处理和无效参数错误

问题描述 投票:0回答:1

我正在编写一个应用程序,使用一些中间位图为我绘制一些图像,但如果我处理用于在位图之前调整图像大小的中间位图,我将从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应该绘制得很好,但是如果我使用第一位代码并且我只想知道原因,则会得到无效的参数错误。我猜它与位图分配的实际工作方式有关,而不是我不知道的,但是一些更多的sage建议得到了高度赞赏。

c# bitmap gdi+
1个回答
0
投票

这是你的问题

Image = ResizedImage;

Bitmap是一个参考类型,此时ImageResizedImage都指向同一位记忆。原来的Image迷路了,变成了内存泄漏

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

ResizedImage.Dispose();

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

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

总之,不要做这个Image = ResizedImage;,也使用using语句

© www.soinside.com 2019 - 2024. All rights reserved.