6

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

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

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

我最好的选择是什么?在 C++ 中转换图像,然后使用 JNI 发送,或者将 RAW 数据发送到 Java,然后将其转换为 .bmp?我将如何最容易地实现这一目标?

4

3 回答 3

7

Java 1.5 中只有两行代码:

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

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

于 2009-07-28T12:26:46.587 回答
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);
}
于 2009-07-28T12:29:58.863 回答
1

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

于 2009-07-28T12:58:14.303 回答