如何将字节数组作为图像文件存储在磁盘上?

Posted

技术标签:

【中文标题】如何将字节数组作为图像文件存储在磁盘上?【英文标题】:How to store a byte array as an image file on disk? 【发布时间】:2011-01-09 11:34:24 【问题描述】:

我有一个图像的字节数组表示。如何将其作为图像文件保存在磁盘上。

我已经这样做了

OutputStream out = new FileOutputStream("a.jpg");
out.write(byteArray);
out.flush();
out.close();

但是当我通过双击打开图像时,它没有显示任何图像。

【问题讨论】:

你的意思是把它写成 PNG 或 JPG 格式,还是只是为了让你可以在某个时候读回来? 你有可以传递给 image.setRGB 的那种数组吗? 你从哪里得到字节[]?你需要知道它有什么格式(JPEG、GIF、PNG、BMP...) 我认为这与他的另一个问题有关:***.com/questions/2138961/… 【参考方案1】:

除了没有使用 try/finally 块(至少在您显示的代码中)应该没问题。 (顺便说一句,如果您要关闭输出流,则不需要刷新它。)

由于它不起作用,这表明 byteArray实际上包含 JPEG 编码的图像。你是如何创建byteArray 的?如果它是“原始”表示,您可能想要对其进行编码,例如使用javax.imageio 包。

【讨论】:

你能不能也看看***.com/questions/2132657/… ........其实都建议我使用swing的MVC架构......但我不想要那个答案..我已经知道了...我想要一个建议或swing的示例示例,它的gui代码分为几个文件...这样我就可以找出我自己的问题.. . 我在谷歌上搜索了很多,但找不到任何这样的例子......【参考方案2】:

您可以使用FileOutputStream 类:

FileOutputStream fos = new FileOutputStream("image.jpg");
try 
    fos.write(someByteArray);

finally 
    fos.close();

【讨论】:

【参考方案3】:

您可以使用ImageIO API。

细节可能有点复杂,但首先您可能想要使用 TYPE_BYTE_INDEXED 类型和一些合适的 IndexColorModel 实例创建一个 BufferedImage。然后把你的字节数组放在那里。提示:您可以通过以下方式获得 BufferedImage 的内部表示:

myDataBuffer = myBufferedImage.getRaster().getDataBuffer();

这可能会返回一个 DataBufferByte 类型的数据缓冲区(检查!),您可以从中获得一个字节数组

myByteArray = ((DataBufferByte) myDataBuffer).getData();

然后你可以使用 System.arraycopy 将你的字节数组复制到上面。

【讨论】:

以上是关于如何将字节数组作为图像文件存储在磁盘上?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用 javascript 将图像转换为字节数组以将图像存储在 sql server 上?

如何将嵌入式资源作为字节数组读取而不将其写入磁盘?

如何将字节数组中的图像文件数据转换为位图?

当字节数组的源是 jpg 时,从存储的字节数组创建位图并保存到磁盘会引发 GDI+ 异常

如何在 iOS 上从 Web 下载原始字节

如何将 zip 文件从字节数组写入磁盘