web-dev-qa-db-ja.com

BufferedImageのRGBを取得する

誰かがBufferedImageからRGB値の配列を取得する方法を説明できますか?

BufferedImageにグレースケールイメージがあり、イメージを説明する0〜255の値の配列を抽出する必要があります。
PufferImageをPNGに保存できるので、BufferedImageが正しいことを知っています。ただし、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に設定されました

18
kotoko

ピクセルの1つから取得するint値は、赤、緑、青、およびアルファで構成されているため、負の数になります。各色成分の値を取得するには、色を分割する必要があります。

これを行う最も簡単な方法は、 Color オブジェクトを作成し、 getRedgetGreen および getBlue (同様にコンポーネントを取得する 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
27
dacwe