IllegalArgumentException:颜色参数超出预期范围:红绿蓝

时间:2013-05-11 13:03:12

标签: java image colors rgb illegalargumentexception

当我使用JUnit测试我的代码时,发生以下错误:

java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue
老实说,我不知道为什么。我的代码不是很长,所以我想发布它以获得更好的帮助。

BufferedImage img = ImageIO.read(f);
        for (int w = 0; w < img.getWidth(); w++) {
            for (int h = 0; h < img.getHeight(); h++) {
                Color color = new Color(img.getRGB(w, h));
                float greyscale = ((0.299f * color.getRed()) + (0.587f
                        * color.getGreen()) + (0.144f * color.getBlue()));
                Color grey = new Color(greyscale, greyscale, greyscale);
                img.setRGB(w, h, grey.getRGB());

当我运行JUnit测试时,eclipse用

标记该行
Color grey = new Color(greyscale, greyscale, greyscale);

所以,我想问题可能是,我使用浮动数字,你可以看到我重新计算图像的红色,绿色和蓝色内容。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

您正在使用三个浮点参数调用Color构造函数,因此允许值介于0.0和1.0之间。

但是color.getRed()(蓝色,绿色)可以返回最多255的值。所以你可以得到以下内容:

float greyscale = ((0.299f *255) + (0.587f * 255) + (0.144f * 255));
System.out.println(greyscale); //262.65

对于1.0f甚至对于Color(int,int,int)构造函数允许的252而言,这是远高的。因此,像dasblinkenlight所说的那样缩放你的因素并将灰度转换为int,否则你将调用错误的Color构造函数。

new Color((int)greyscale,(int)greyscale,(int)greyscale);