2009-07-28 106 views
6

我有一個C++應用程序,它可以與相機進行通信並獲取原始圖像數據。 然後我在C++中有一個Byte [],我想用JNI發送給Java。如何在Java中使用原始字節[]創建BMP文件

但是,我需要將原始字節[]轉換爲真正的文件格式(.bmp是我的第一選擇)。 如果我使用BITMAPFILEINFO和BITMAPHEADERINFO將它從C++寫入硬盤驅動器上的文件,我可以輕鬆地做到這一點,但我不知道如何將整個格式發送到Java。

然後我想使用JNI只發送原始字節[]數據,然後將其轉換爲 .bmp,但我似乎無法找到任何用於在Java中執行此操作的好庫。

什麼是我最好的選擇?在C++中轉換圖像,然後使用JNI發送它,或者將RAW數據發送給Java,然後將其轉換爲.bmp?我最容易做到這一點?

回答

6

它在Java 1.5的只是兩行:

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

的Java(在Windows上)知道如何導出JPG,PNG和BMP,據我所知。

+1

此解決方案不適合我。圖像總是返回爲空。所以ImageIO.write會拋出異常。我的字節數組是一個原始的Y圖像數據。你能詳細解釋一下嗎? – 2014-01-09 06:12:24

+0

你確定你的byteArray是一個有效的圖像嗎?我認爲獲得`image == null`的唯一方法是如果沒有註冊的ImageReader可以解碼你的流。所以我的猜測是,這是一種不受支持的文件類型或損壞的數據。 – Stroboskop 2014-01-09 11:27:49

4

沒有必要這樣做。將字節數組轉換爲InputStream並將其提供給ImageIO.read();

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

這產生從字節數組,這是非常然後瑣碎實際上對GUI組件內顯示圖像對象。如果你想保存它,你也可以使用ImageIO類。

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

如果你知道如何爲.bmp寫入一個文件,那麼你可以使用(幾乎)相同的代碼寫入到內存緩衝區來代替。您可以將這個內存緩衝區提供給Java,並讓它解碼Stroboskop或Markus Koivisto提到的格式。如果您編輯了問題以包含將數據寫入.bmp文件的方式,那麼我可以建議如何將其轉換爲內存中操作。