2009-07-28 32 views
6

私はカメラと通信し、生の画像データを取り出すC++アプリケーションを持っています。 次に、私はJNIでJavaに送信したいC++のByte []を持っています。Javaでraw byte []からBMPファイルを作成するには

しかし、生のByte []を実際のファイル形式に変換する必要があります(.bmpが私の最初の選択でした)。 BITMAPFILEINFOとBITMAPHEADERINFOを使用してC++からハードドライブ上のファイルに書き込むと簡単に実行できますが、全体フォーマットをJavaに送信する方法がわかりません。

次に、私は生のバイト[]データをJNIを使​​って送信し、それを .bmpに変換することを考えましたが、Javaでこれを行うための良いライブラリを見つけることができないようです。

私の最高の選択肢は何ですか? C++でイメージを変換し、JNIを使​​ってイメージを送信するか、RAWデータをJavaに送信してから.bmpに変換しますか?どのように私はこれを達成するのが簡単でしょうか?

答えて

6

Java 1.5でわずか2行です:

BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray)); 
ImageIO.write(image, "BMP", new File("filename.bmp")); 

(Windowsの場合)は、Java私の知る限りではJPG、PNGとBMPをエクスポートする方法を知っています。

+1

この解決策は私のためには機能しません。 imageは常にnullとして返されます。したがって、ImageIO.writeは例外をスローします。私のバイト配列は生のY画像データです。もっと詳しく説明できますか? –

+0

あなたのbyteArrayが有効な画像であることは確かですか? 'image == null'を取得する唯一の方法は、ストリームをデコードできるImageReaderが登録されていない場合です。だから、私の推測では、サポートされていないファイルタイプか、またはデータが破損しているファイルタイプのいずれかです。 – Stroboskop

+0

4:0:0の比率のYUV画像データ。 –

4

これを行う必要はありません。バイト配列をInputStreamに変換し、ImageIO.read()に渡します。

public Image getImageFromByteArray(byte[] byteArray){ 
    InputStream is = new ByteArrayInputStream(byteArray); 
    return ImageIO.read(is); 
} 

これは、GUIコンポーネントの内側に表示することが確かに非常に簡単です、あなたのバイト配列からImageオブジェクトを作成します。保存したい場合は、ImageIOクラスも使用できます。

public void saveImage(Image img, String fileFormat, File f){ 
    ImageIO.write(img, fileFormat, f); 
} 
+0

これは正常に動作しますか? ImageIOは、バイト配列に格納されているピクセルの形式をどのように知っていますか? –

+1

これは他のグラフィックスツールのようにファイルヘッダーをチェックするためです。 – Stroboskop

+0

純RGBバッファであれば、BufferedImage.setRGB()のドキュメントを参照してください。 –

1

ファイルに.bmpとして書く方法を知っているならば、あなたは(ほとんど)の代わりにメモリバッファへの書き込みのために同じコードを使用することができます。そのメモリーバッファーをJavaに渡すことができ、StroboskopやMarkus Koivistoのようなフォーマットをデコードすることができます。質問を編集してデータを.bmpファイルに書き込む方法を含めた場合、そのデータをメモリ内操作に変換する方法を提案できます。

関連する問題