我有一个问题,我有一个方法,它采取一个Image对象,将其处理为1个颜色通道(另外2个是纯黑色),然后从该过程返回一个新图像。
现在的问题是,当我在方法中创建新图像并在调试期间查看对象时,图像对象看起来非常好。但是当我将它返回到一个空的Image对象时,该Image对象内的属性都显示“System.ArgumentException”
这是该方法的代码:
public Image GetRedImage(Image sourceImage)
{
using (Bitmap bmp = new Bitmap(sourceImage))
using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height))
{
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color pxl = bmp.GetPixel(x, y);
Color redPxl = Color.FromArgb((int)pxl.R, 1, 1);
redBmp.SetPixel(x, y, redPxl);
}
}
Image tout = (Image)redBmp;
return tout;
}
}
谁知道到底发生了什么?
非常感谢。
答案 0 :(得分:3)
redBmp正在被你的使用块处理掉,并且tout是redBmp强制转换为Image类型。删除redBmp的使用块。
门诺
答案 1 :(得分:1)
您已将redBmp
包装在using
语句中,以便在方法退出时调用Dispose
方法。如果您要在方法之外使用它(您将其转换为Image
并将其返回),则不应将其丢弃。
public Image GetRedImage(Image sourceImage)
{
Bitmap redBmp = null;
using (Bitmap bmp = new Bitmap(sourceImage))
{
redBmp = new Bitmap(sourceImage.Width, sourceImage.Height);
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color pxl = bmp.GetPixel(x, y);
Color redPxl = Color.FromArgb((int)pxl.R, 1, 1);
redBmp.SetPixel(x, y, redPxl);
}
}
}
return redBmp as Image;
}
答案 2 :(得分:1)
使用using
块,一旦离开使用范围,就会处理图像。
尝试从顶部替换这两行:
using (Bitmap bmp = new Bitmap(sourceImage))
using (Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height))
使用:
Bitmap bmp = new Bitmap(sourceImage);
Bitmap redBmp = new Bitmap(sourceImage.Width, sourceImage.Height);
现在它应该可以工作,根据您的程序逻辑,您将不得不手动处理这些图像。
你可能也会使用bmp
处理使用但肯定不是redBmp
对象,因为你基本上都要返回它,所以要么你克隆它并返回克隆,要么你不处理它,或者你返回一个处理不可用的对象,就像现在正在发生的事情一样。