2012-04-08 14 views
4

.bmpファイルのピクセル値を含むバイト配列があります。Javaのピクセルバイト配列からbmpイメージを作成する方法

BufferedImage readImage = ImageIO.read(new File(fileName)); 
byte imageData[] = ((DataBufferByte)readImage.getData().getDataBuffer()).getData(); 

これで、.bmpイメージを再作成する必要があります。私はBufferedImageを作成し、setPixelsメソッドを呼び出すことによってWritableRasterのピクセルを設定しようとしました。しかし、そこではint []、float []またはdouble []配列を提供する必要があります。バイト配列をこれらのいずれかに変換する必要があるかもしれません。しかし、私はそれをどうやって行うのか分かりません。私はまた、setDataElementsメソッドを試しました。しかし、私はこの方法の使い方もわかりません。

誰でもバイト配列からbmpイメージを作成する方法を説明できますか?

編集: @Perception

これは私がこれまでにやっていることです:

private byte[] getPixelArrayToBmpByteArray(byte[] pixelData, int width, int height, int depth) throws Exception{ int[] pixels = byteToInt(pixelData); BufferedImage image = null; if(depth == 8) { image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); } else if(depth == 24){ image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } WritableRaster raster = (WritableRaster) image.getData(); raster.setPixels(0, 0, width, height, pixels); image.setData(raster); return getBufferedImageToBmpByteArray(image); } private byte[] getBufferedImageToBmpByteArray(BufferedImage image) { byte[] imageData = null; try { ByteArrayOutputStream bas = new ByteArrayOutputStream(); ImageIO.write(image, "bmp", bas); imageData = bas.toByteArray(); bas.close(); } catch (Exception e) { e.printStackTrace(); } return imageData; } private int[] byteToInt(byte[] data) { int[] ints = new int[data.length]; for (int i = 0; i < data.length; i++) { ints[i] = (int) data[i] & 0xff; } return ints; }

事は、これは灰色のイメージのためだけで正常に動作するが、カラー画像の色が正しくありません。私はこれがbyteToIntメソッドと関係があると思っています..誰かがそれを改善する方法を知っていたり、新しい簡単な解決策を持っていれば、あなたは助けてくれます.. :)

+0

イメージデータを設定するための現在のコードを表示しますか? – Perception

+0

本当に 'Raster'から読み込む必要はありますか? [ByteArrayOutputStreamで読み書きする](http://stackoverflow.com/a/356650/104223)を試しましたか? – Leigh

+0

@Leigh与えられたリンクは、異なるタイプの別の画像から(特定のタイプの)画像を作ることです。しかし、問題はイメージがありません、私はピクセルの幅と高さに沿って、bmpイメージのピクセル部分を持っています。うーん努力していただきありがとうございます.. –

答えて

2

それぞれに3バイトをパックする必要がありますあなたが作る整数。バッファリングされたイメージのフォーマットに応じて、0xRRGGBBになります。

byteToIntはこのように3つのバイトを消費する必要があります:

private int[] byteToInt(byte[] data) { 
    int[] ints = new int[data.length/3]; 

    int byteIdx = 0; 
    for (int pixel = 0; pixel < ints.length) { 
     int rByte = (int) pixels[byteIdx++] & 0xFF; 
     int gByte = (int) pixels[byteIdx++] & 0xFF; 
     int bByte = (int) pixels[byteIdx++] & 0xFF; 
     int rgb = (rByte << 16) | (gByte << 8) | bByte 
     ints[pixel] = rgb; 
    } 
} 

あなたはまた、単にバイト配列を持つByteBuffer.wrap(arr, offset, length) .toInt()

0

を使用することができますすることは十分ではありません。また、ヘッダーを作成する必要があります(DICOMファイルのような生の形式から読み込む場合)。

関連する問題