代码之家  ›  专栏  ›  技术社区  ›  Silfverstrom

如何从爪哇原始字节[]创建BMP文件

  •  6
  • Silfverstrom  · 技术社区  · 15 年前

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

    但是,我需要将原始字节[]转换为真正的文件格式(.bmp是我的第一选择)。 我可以很容易做到这一点,如果我写它从C++到硬盘上的一个文件,使用BITMAPFILIONFION和BITMAPHEAD信息,但是我不知道如何将整个格式发送到Java。

    然后我考虑使用JNI只发送原始字节[]数据,然后将其转换为 BMP,但是在Java中我似乎找不到好的库。

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

    3 回复  |  直到 15 年前
        1
  •  7
  •   Stroboskop    15 年前

    它只是Java 1.5中的两行:

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

    据我所知,Java(Windows)知道如何导出JPG、PNG和BMP。

        2
  •  4
  •   Markus Koivisto    15 年前

    没必要这么做。将字节数组转换为输入流,并将其馈送到imageio.read();

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

    这将从字节数组中创建一个图像对象,然后在一个GUI组件中显示它就变得非常简单了。如果要保存它,也可以使用ImageIO类进行保存。

    public void saveImage(Image img, String fileFormat, File f){
        ImageIO.write(img, fileFormat, f);
    }
    
        3
  •  1
  •   Marc Mutz - mmutz    15 年前

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