C#将图片转为灰度图时出现循环ArgumentOutOfRangeException报错如何解决?
问题原因
你代码的核心错误是创建新Bitmap对象时,宽高参数的顺序填反了。
.NET 中 Bitmap 类的构造函数 Bitmap(int width, int height, PixelFormat format) 第一个入参为新画布的宽度,第二个入参为新画布的高度。你当前的代码写为:
Bitmap newmap=new Bitmap(mymap.Height,mymap.Width,mymap.PixelFormat);
相当于把原图的高度作为新图的宽度、原图的宽度作为新图的高度。只要你的原始图片不是正方形,新图的宽度就会小于循环中x的最大值(x最大为原图宽度mymap.Width),调用newmap.SetPixel(x,y)时x超出了新图的宽度合法范围,就会抛出 ArgumentOutOfRangeException: Parameter must be positive and < Width. (Parameter 'x') 异常。
修复方案
把新Bitmap创建行的宽高参数调换顺序即可:
Bitmap newmap = new Bitmap(mymap.Width, mymap.Height, mymap.PixelFormat);
可选优化
你当前用RGB三色平均值计算灰度的方式实现简单,但灰度效果不符合人眼感知规律,可以替换为加权平均公式,获得更自然的灰度效果:
int av = (int)(r * 0.299 + g * 0.587 + b * 0.114);
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

