如何在Java中从原始字节[]创建BMP文件 我有一个C++应用程序,它与摄像机通信并获取原始图像数据。 然后我在C++中有一个字节[],我想用JNI发送给java。

如何在Java中从原始字节[]创建BMP文件 我有一个C++应用程序,它与摄像机通信并获取原始图像数据。 然后我在C++中有一个字节[],我想用JNI发送给java。,java,c++,image,java-native-interface,bmp,Java,C++,Image,Java Native Interface,Bmp,但是,我需要将原始字节[]转换为实际文件格式(.bmp是我的第一选择)。 如果我用C++和BITMAPFILIONFION和BITMAPHEADEFILIONFILE将它从C++写入到硬盘上的文件,那么我可以很容易地做到这一点,但是我不知道如何将整个格式发送给java。 然后我考虑使用JNI只发送原始字节[]数据,然后将其转换为 .bmp,但我似乎找不到任何好的库来在Java中执行此操作 我最好的选择是什么?转换C++中的图像,然后使用JNI发送,或者将原始数据发送到java,然后将其转换成.b

但是,我需要将原始字节[]转换为实际文件格式(.bmp是我的第一选择)。 如果我用C++和BITMAPFILIONFION和BITMAPHEADEFILIONFILE将它从C++写入到硬盘上的文件,那么我可以很容易地做到这一点,但是我不知道如何将整个格式发送给java。 然后我考虑使用JNI只发送原始字节[]数据,然后将其转换为 .bmp,但我似乎找不到任何好的库来在Java中执行此操作


我最好的选择是什么?转换C++中的图像,然后使用JNI发送,或者将原始数据发送到java,然后将其转换成.bmp?如何最容易实现这一点?

在Java 1.5中只有两行:

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

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

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

这将从字节数组中创建一个图像对象,而在gui组件中显示该对象实际上非常简单。如果要保存它,也可以使用ImageIO类

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

如果您知道如何以
.bmp
的形式写入文件,则可以使用(几乎)相同的代码写入内存缓冲区。您可以将内存缓冲区发送到Java,并让它解码前面提到的Stroboskop或Markus Koivisto格式。如果您将问题编辑为包含将数据写入
.bmp
文件的方式,我可以建议如何将其转换为内存中的操作。

您确定这会起作用吗?ImageIO如何知道字节数组中存储的像素的格式?因为它会像任何其他图形工具一样检查文件头。如果您拥有的是纯RGB缓冲区,您可能需要查看BuffereImage.setRGB()的文档。此解决方案不适用于我。图像始终返回为空。所以ImageIO.write抛出异常。我的字节数组是原始Y图像数据。你能详细说明一下吗?你确定你的byteArray是一个有效的图像吗?我认为获得
image==null
的唯一方法是如果没有注册的ImageReader可以解码您的流。因此,我的猜测是,要么是不受支持的文件类型,要么是损坏的数据。这是一个YUV图像数据,比率为4:0:0。我不是图像格式专家,但我认为BuffereImage只支持RGB的变体。您可能需要将其转换为RGB。看看这个问题,其中包括YUV-RGB转换代码。
public void saveImage(Image img, String fileFormat, File f){
    ImageIO.write(img, fileFormat, f);
}