如何在Java中使用raw byte []创建BMP文件

时间:2009-07-28 12:22:25

标签: java c++ image java-native-interface bmp

我有一个C ++应用程序,它与相机通信并获取原始图像数据。 然后我在C ++中有一个Byte [],我想用JNI发送给Java。

但是,我需要将原始Byte []转换为真实的文件格式(.bmp是我的第一选择)。 如果我使用BITMAPFILEINFO和BITMAPHEADERINFO将它从C ++写入硬盘驱动器上的文件,我可以很容易地做到这一点,但我不知道如何将整个格式发送到Java。

然后我考虑使用JNI仅发送原始byte []数据,然后将其转换为 .bmp,但我似乎无法在Java中找到任何好的库。

什么是我最好的选择?用C ++转换图像然后使用JNI发送它或将RAW数据发送到Java然后将其转换为.bmp?我最容易实现这个目标吗?

3 个答案:

答案 0 :(得分:7)

Java 1.5中只有两行:

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

Java(在Windows上)知道如何导出jpg,png和bmp据我所知。

答案 1 :(得分:4)

没有必要这样做。将字节数组转换为InputStream并将其提供给ImageIO.read();

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

这会从你的字节数组中创建一个Image对象,然后在gui组件中显示它是非常微不足道的。如果您想保存它,您也可以使用ImageIO类。

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

答案 2 :(得分:1)

如果您知道如何将.bmp写入文件,那么您可以使用(几乎)相同的代码来写入内存缓冲区。你可以将这个内存缓冲区运送到Java,并让它解码像Stroboskop或Markus Koivisto这样的格式。如果您编辑了问题以包括将数据写入.bmp文件的方式,我可以建议如何将其转换为内存中操作。