Java 获取图像的所有RGB颜色

Java 获取图像的所有RGB颜色,java,rgb,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 C

到目前为止,我有:

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

早些时候,我尝试将
getRed
getGreen
getBlue
放在for循环中,但它只显示相同的RGB值。如何获取图像中的所有RGB值?假设我想将它们存储在不同的数组中。

我不太清楚这个问题,但假设你指的是唯一的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
循环时,您在数组中使用的是索引变量,而不是静态值,如
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();
}
for(int i=0;i>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()));
}
final buffereImage image=ImageIO.read(新URL(“http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
final Set uniqueColors=新HashSet(image.getWidth()*image.getHeight());
对于(int y=0;y

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

是否获取所有唯一的RGB值?或者单个组件的单独使用?您是否试图确定某个特定图像是否(比如)更“绿色”而不是“红色”?或者完全是别的?我想确定红色、绿色和蓝色的不同值。这是一个K-means项目。如果我使用这个,它是否完全确定它从所述图像中获得RGB颜色?对不起,我对这些RGB的东西很陌生。如果我为每种颜色创建四个不同的for循环,这意味着在不同的数组中有三个for循环,对吗?它们是正确的颜色吗?颜色由四个属性定义:红色、绿色、蓝色和alpha。除非您对构成单一颜色的值感兴趣,否则不需要单独处理这四个属性。不要将红色通道值与颜色混淆;是的,红色被定义为红色通道中有255个,绿色和蓝色通道中有0个,但是你不能将大量颜色中的所有红色通道值合并在一起,并期望通过这样做得到任何有意义的结果。我正在尝试确定红、绿和蓝色的不同值。这是一个K-means项目。当我需要处理任何关于图像的事情时——这是很少见的,但确实发生了——我会求助于Python,因为有可用的计算机视觉库。如果需要使用Java,那么JVM有OpenCV绑定:-因此这里应该可以将示例转换为使用OpenCV的Java。
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()));
}