How to Compare an RGB Value to Color?

2019-09-18 22:53发布

问题:

I'm scanning through the pixels in a BufferedImage to see if some of the pixels are a certain color. I've tried this by doing the following:

for(int x = 0; x < 16; x++) {
    for(int y = 0; y < 16; y++) {
        if(image.getRGB(x, y) == new Color(209, 167, 86).getRGB()) System.out.println("Same Color Detected!");
    }
}

But image.getRGB() returns a different value to Color.getRGB(). How can I compare them?

These are some examples of the values (first digit is from image, second the colour I'm comparing):

0 : -8060928
-16777216 : -8060928
-3037354 : -8060928
-3037354 : -8060928
-16777216 : -8060928

Here's how I'm getting the image:

playerOrig = ImageIO.read(getClass().getResourceAsStream("/Player/player.gif"));

I'm using Eclipse with Java 1.6

I printed out the ColorModel of the image and got this:

IndexColorModel: #pixelBits = 4 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@45d6a56e transparency = 2 transIndex   = 11 has alpha = true isAlphaPre = false

I then printed out the ColorSpace of the Color object and got this:

java.awt.color.ICC_ColorSpace@45d6a56e

Here's the image:

回答1:

Based on the sample image you've supplied, you're only inspecting a 16x16 grid of the image, when the image is 320x320 pixels in size...

When I update your code to include the full width and height of the image, it works just fine...

try {
    BufferedImage img = ImageIO.read(...);
    Color match = new Color(209, 167, 86);

    for (int x = 0; x < img.getWidth(); x++) {
        for (int y = 0; y < img.getHeight(); y++) {
            if (img.getRGB(x, y) == match.getRGB()) {
                System.out.println("Same Color Detected!");
            }
        }
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

Updated

Based on the new, smaller, example the code still works...

To prove it, I wrote a simple color replacement algorithim...


try {
    BufferedImage img = ImageIO.read(new File("8bit.gif"));
    BufferedImage replaced = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Color match = new Color(209, 167, 86);
    Color with = new Color(0, 255, 0);

    for (int x = 0; x < img.getWidth(); x++) {
        for (int y = 0; y < img.getHeight(); y++) {
            int pixel = img.getRGB(x, y);
            if (pixel == match.getRGB()) {
                System.out.println("Same Color Detected!");
                replaced.setRGB(x, y, with.getRGB());
            } else {
                replaced.setRGB(x, y, pixel);
            }
        }
    }

    ImageIO.write(replaced, "png", new File("replaced.png"));

    JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(replaced)));
} catch (IOException ex) {
    ex.printStackTrace();
}


回答2:

Works for me ...

NOTE: well I tested the code on my local machine and it works for me just fine as you have it with the default ColorModel. I am using OSX and Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Good Luck!

Here is a link to my entire Mavenized project on GitHub.com

import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Q23751298
{
    public static void main(String[] args)
    {
        try
        {
        //final BufferedImage img = ImageIO.read(new File("/Users/jhr/Pictures/fu4FM.gif"));
        final BufferedImage img = ImageIO.read(Q23751298.class.getResource("/fu4FM.gif"));
            final int match = new Color(209, 167, 86).getRGB();

            for (int x = 0; x < img.getWidth(); x++)
            {
                for (int y = 0; y < img.getHeight(); y++)
                {
                    final int irgb = img.getRGB(x, y);
                    if (irgb == match)
                    {
                        System.out.format("%d/%d = %d : %d\n", x, y, img.getRGB(x, y), match);
                    }
                }
            }
        }
        catch (IOException e)
        {
            System.out.println(e.getMessage());
        }
    }
}

Here is the output I get for the 16 X 16 file you posted:

4/9 = -3037354 : -3037354
4/10 = -3037354 : -3037354
4/11 = -3037354 : -3037354
6/4 = -3037354 : -3037354
7/4 = -3037354 : -3037354
7/5 = -3037354 : -3037354
7/6 = -3037354 : -3037354
7/7 = -3037354 : -3037354
8/4 = -3037354 : -3037354
8/5 = -3037354 : -3037354
8/6 = -3037354 : -3037354
8/7 = -3037354 : -3037354
9/4 = -3037354 : -3037354
9/7 = -3037354 : -3037354
10/5 = -3037354 : -3037354
10/6 = -3037354 : -3037354
12/10 = -3037354 : -3037354
12/11 = -3037354 : -3037354


标签: java colors rgb