如何在 Java 中从原始字节 [] 创建 BMP 文件

Posted

技术标签:

【中文标题】如何在 Java 中从原始字节 [] 创建 BMP 文件【英文标题】:How to create a BMP file from raw byte[] in Java 【发布时间】:2010-11-14 16:35:23 【问题描述】:

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

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

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

什么是我最好的选择?在 C++ 中转换图像,然后使用 JNI 发送,或者将 RAW 数据发送到 Java,然后将其转换为 .bmp?我怎样才能最容易地做到这一点?

【问题讨论】:

【参考方案1】:

在 Java 1.5 中只有两行代码:

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

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

【讨论】:

这个解决方案对我不起作用。图像始终返回为空。所以 ImageIO.write 抛出异常。我的字节数组是原始 Y 图像数据。你能详细说明一下吗? 你确定你的 byteArray 是一个有效的图像吗?我认为获得image == null 的唯一方法是,如果没有注册的 ImageReader 可以解码您的流。所以我的猜测是它要么是不受支持的文件类型,要么是损坏的数据。 它是一个比例为 4:0:0 的 YUV 图像数据。 我不是图像格式方面的专家,但我认为 BufferedImage 仅支持 RGB 的变体。您可能必须将其转换为 RGB。看看这个问题,其中包括 YUV - RGB 转换代码。 ***.com/questions/9325861/…【参考方案2】:

没有必要这样做。将字节数组转换为 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);

【讨论】:

你确定这会起作用吗? ImageIO如何知道字节数组中存储的像素格式? 因为它会像任何其他图形工具一样检查文件头。 如果您拥有的是纯 RGB 缓冲区,您可能需要查看 BufferedImage.setRGB() 的文档【参考方案3】:

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

【讨论】:

以上是关于如何在 Java 中从原始字节 [] 创建 BMP 文件的主要内容,如果未能解决你的问题,请参考以下文章

int像素数组到java中的bmp

读取 .bmp 图像并从图像的第 10 个字节中减去 10 并在 Java 中重新创建图像

将字节数组转换/显示为 bmp/jpeg 图像

使用 JavaFX 将 BMP 加载到字节数组中

在 Java 中从字节转换为 int

如何批量读取bmp图片的原始高和宽