5

当我用 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);

所以,我想问题可能是,我使用浮点数,正如你所见,我重新计算了图像的红色、绿色和蓝色内容。

谁能帮我解决这个问题?

4

1 回答 1

12

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

但是 color.getRed() (Blue, Green) 可以返回一个最大为 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);
于 2013-05-11T13:14:55.787 回答