有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您确定在使用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()));
    }
    

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

  2. # 2 楼答案

    我不完全清楚这个问题,但假设你指的是唯一的RGB值,只需循环,然后使用java。util。设置保持唯一性的实现

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