获取图像的所有RGB颜色

时间:2014-12-07 05:41:10

标签: java rgb

到目前为止,我有这个:

BufferedImage image = ImageIO.read(
     new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));

int w = image.getWidth();
int h = image.getHeight();

int[] dataBuffInt = image.getRGB(0, 0, w, h, null, 0, w); 

Color c = new Color(dataBuffInt[100]);

System.out.println(c.getRed());   // = (dataBuffInt[100] >> 16) & 0xFF
System.out.println(c.getGreen()); // = (dataBuffInt[100] >> 8)  & 0xFF
System.out.println(c.getBlue());  // = (dataBuffInt[100] >> 0)  & 0xFF
System.out.println(c.getAlpha()); // = (dataBuffInt[100] >> 24) & 0xFF

之前,我尝试将getRedgetGreengetBlue置于for循环中,但它只显示相同的RGB值。如何获取图像中的所有RGB值?鉴于我想将它们存储在不同的阵列中。

2 个答案:

答案 0 :(得分:0)

我对这个问题并不完全清楚,但假设你的意思是唯一的RGB值,只需要循环,并使用说java.util.Set实现来保持唯一性?

Set<Color> colors = new HashSet<Color>();
for (int datum : dataBuffInt) {
    colors.add(new Color(datum));
}
System.out.println(String.format("%d different colors", colors.size()));

或者,如果您的意思是单独的组件?

for (int datum : dataBuffInt) {
    Color color = new Color(datum);
    reds.add(color.getRed());
    greens.add(color.getGreen());
    blues.add(color.getBlue());

}
System.out.println(String.format("reds: %d greens: %d blues: %d", reds.size(), greens.size(), blues.size()));

答案 1 :(得分:0)

您是否确定在使用for循环时将索引变量用于数组而不是静态值,如100?当我使用for循环运行代码时,我看到了不同的值:

for (int i = 0; i < dataBuffInt.length; i++) {
    Color c = new Color(dataBuffInt[i]);

    System.out.println("COLOR");
    System.out.println(c.getRed());   // = (dataBuffInt[100] >> 16) & 0xFF
    System.out.println(c.getGreen()); // = (dataBuffInt[100] >> 8)  & 0xFF
    System.out.println(c.getBlue());  // = (dataBuffInt[100] >> 0)  & 0xFF
    System.out.println(c.getAlpha()); // = (dataBuffInt[100] >> 24) & 0xFF
    System.out.println();
}

如果你想要独特的颜色,你可以一次建立一个像素集:

final BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
final Set<Color> uniqueColors = new HashSet<Color>(image.getWidth() * image.getHeight());
for (int y = 0; y < image.getHeight(); y++) {
    for (int x = 0; x < image.getWidth(); x++) {
        final int rgb = image.getRGB(x, y);
        uniqueColors.add(new Color(rgb));
    }
}

for (final Color color : uniqueColors) {
    System.out.println(format("red: {0}, green: {1}, blue: {2}, alpha: {3}",
            color.getRed(),
            color.getGreen(),
            color.getBlue(),
            color.getAlpha()));
}

或者使用现有代码并将数组转储到集合中。