5

JNAを使用しています。そして、c++メソッドから生データのバイト配列を取得しています。今、私はこの生データのバイト配列を使用してJavaでバッファリングされた画像を取得する方法で立ち往生しています。私はそれをtiff画像として取得するためにいくつかのことを試みましたが、私は成功しませんでした。これは私がこれまでに試したコードです。ここで私のバイト配列には16ビットグレースケール画像のデータが含まれています。このデータはxセンサーデバイスから取得します。そして今、私はこのバイト配列から画像を取得する必要があります。

初挑戦

byte[] byteArray = myVar1.getByteArray(0, 3318000);//array of raw data

          ImageInputStream stream1=ImageIO.createImageInputStream(newByteArrayInputStream(byteArray));
            ByteArraySeekableStream stream=new ByteArraySeekableStream(byteArray,0,3318000);
                 BufferedImage bi = ImageIO.read(stream);

2回目の試行

        SeekableStream stream = new ByteArraySeekableStream(byteArray);
         String[] names = ImageCodec.getDecoderNames(stream);


          ImageDecoder dec = ImageCodec.createImageDecoder(names[0], stream, null);
//at this line get the error ArrayIndexOutOfBoundsException: 0 
            RenderedImage im = dec.decodeAsRenderedImage();

私はここで行方不明だと思います。私の配列には生データが含まれているため、tiff画像のヘッダーは含まれていません。miでしょ?はいの場合、このヘッダーをバイト配列で提供する方法。そして最終的にこのバイト配列から画像を取得する方法は?

ネイティブメソッドから適切なバイト配列を取得していることをテストするために、このバイト配列を.rawファイルとして保存し、ImageJソフトウェアでこのrawファイルを開いた後、正しい画像を表示して、rawデータが正しいようにします。私が必要とする唯一のことは、私の生のバイト配列を画像のバイト配列に変換する方法ですか?

4

2 に答える 2

9

生のピクセルデータを に変換するために使用しているものは次のとおりですBufferedImage。私のピクセルは 16 ビットで署名されています。

public static BufferedImage short2Buffered(short[] pixels, int width, int height) throws IllegalArgumentException {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY);
    short[] imgData = ((DataBufferShort)image.getRaster().getDataBuffer()).getData();
    System.arraycopy(pixels, 0, imgData, 0, pixels.length);     
    return image;
}

次に、JAI を使用して結果の画像をエンコードしています。コードも必要な場合は教えてください。

編集:同様の質問に対する@Brent Nashの回答のおかげで、速度が大幅に向上しました。

編集: 完全を期すために、符号なし 8 ビットのコードを次に示します。

public static BufferedImage byte2Buffered(byte[] pixels, int width, int height) throws IllegalArgumentException {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    byte[] imgData = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
    System.arraycopy(pixels, 0, imgData, 0, pixels.length);     
    return image;
}
于 2012-06-19T16:11:28.187 に答える
4

バイト配列に文字通りピクセルデータだけが含まれているか、TIFF などの構造化された画像ファイルが含まれているかどうかは、どこから取得したかによって異なります。提供された情報からそれに答えることは不可能です。

ただし、構造化された画像ファイルが含まれている場合は、通常、次のことができます。

  • ByteArrayInputStream をラップします
  • そのストリームを ImageIO.read() に渡します

文字通り生のピクセル データしかない場合は、主なオプションがいくつかあります。

  • 「手動で」そのピクセル データを取得して、ARGB 形式のピクセルごとに 1 つの int を持つ int 配列になるようにします (ByteBuffer および IntBuffer クラスは、バイトをいじるのに役立ちます)。
  • 空の BufferedImage を作成し、その setRGB() メソッドを呼び出して、以前に準備した int 配列から実際のピクセルの内容を設定します

ビットとバイトで何をしているのかを知っていれば、上記が最も簡単だと思います。ただし、原則として、次のことができる必要があります。

  • データをラップした WritableRaster オブジェクトを作成する適切な WritableRaster.create... メソッド メソッドを見つけます
  • その WritableRaster を関連する BufferedImage コンストラクターに渡して、イメージを作成します。
于 2012-05-23T12:52:56.487 に答える