【问题标题】:Get RGB of a BufferedImage获取 BufferedImage 的 RGB
【发布时间】:2012-06-04 10:52:10
【问题描述】:

谁能解释如何从 BufferedImage 中获取 rgb 值数组?

我在 BufferedImage 中有一个灰度图像,需要提取一个包含 0 到 255 个值的数组来描述图像。
我知道 BufferedImage 是正确的,因为我可以将它保存为 PNG。但是,如果我使用int[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData();,我会得到一堆巨大的负数。

我已经搜索了一段时间,看到了一些关于转移某些值的参考 (post),但并不真正理解他们在说什么。

基本上,我想从 BufferedImage 转到 0 到 255 个 RBG 值的数组。
我不确定我是否正确解释了自己,请询问更多详细信息。

编辑:
@Garbage 感谢您的提示。我试过 int[] dataBuffInt = heightMap.getRGB(0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth());但得到相同的结果。
@Greg Kopff 结果是 2,它被设置为 TYPE_INT_ARGB

【问题讨论】:

  • BufferedImage.getType() 的结果是什么?
  • @Garbage 感谢您的提示。我试过 int[] dataBuffInt = heightMap.getRGB(0, 0, heightMap.getWidth(), heightMap.getHeight(), null, 0, heightMap.getWidth());但得到相同的结果。

标签: java bufferedimage


【解决方案1】:

您得到负数,因为您从其中一个像素获得的 int 值由红色、绿色、蓝色和 alpha 组成。您需要拆分颜色以获得每个颜色分量的值。

最简单的方法是创建一个Color 对象并使用getRedgetGreengetBlue(以及getAlpha)方法来获取组件:

public static void main(String... args) throws Exception {

    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
}

输出:

173
73
82
255

【讨论】:

  • 非常感谢!只是为了检查,为了找到图像中的所有点,我必须做一些循环,没有其他更有效的方法,对吧?
  • 将示例更改为使用int[] getRGB(...) 返回的数据。数据以ARGB 模式返回,因此您可以自己提取颜色分量,但是,请始终先配置文件,而不是进行过早的优化。 :)
  • 添加了一种“更快”的方式来使用 bitfiddling 获得相同的东西! :)
  • 大家好,是上面代码中得到的图像的平均rgb @kotoko
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多