19

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

BufferedImage にグレースケール画像があり、画像を説明する 0 ~ 255 の値の配列を抽出する必要があります。
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に設定されました

4

1 に答える 1

30

ピクセルの 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
于 2012-06-04T14:24:41.080 に答える