如何在 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 文件的主要内容,如果未能解决你的问题,请参考以下文章