Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IllegalArgumentException: Color parameter outside of expected range: Red Green Blue

when I tested my code with JUnit, the following error occured:

java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue

Honestly, I don't know why. My code is not very long, so I would like to post it for better help.

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());

When I run the JUnit test, eclipse marks up the line with

Color grey = new Color(greyscale, greyscale, greyscale);

So, I suppose the problem might be, that I work with floating numbers and as you can see I recalculate the red, green and blue content of the image.

Could anyone help me to solve that problem?

like image 770
Hagi Avatar asked Dec 20 '22 05:12

Hagi


1 Answers

You are calling the Color constructor with three float parameters so the values are allowed to be between 0.0 and 1.0.

But color.getRed() (Blue, Green) can return a value up to 255. So you can get the following:

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

Which is far to high for 1.0f and even for 252 which the Color(int,int,int) constructor allows. So scale your factors like dasblinkenlight said and cast the greyscale to an int or else you will call the wrong constructor of Color.`

new Color((int)greyscale,(int)greyscale,(int)greyscale);
like image 111
mszalbach Avatar answered Apr 09 '23 03:04

mszalbach