java - 使用 IOUtils 和 ImageIO 写入图像文件有什么区别

标签 java image file-io base64 tiff

我有一个 tiff 图像作为 Base64 编码的字符串存储在一个文件中。我的目标是从中创建一个 tiff 文件。这就是我正在做的:

String base64encodedTiff = IOUtils.toString(new FileInputStream("C:/tiff-attachment.txt"));    
byte[] imgBytes = DatatypeConverter.parseBase64Binary(base64encodedTiff);
BufferedImage bufImg = ImageIO.read(new ByteArrayInputStream(imgBytes));   
ImageIO.write(bufImg, "tiff", new File("c:/new-darksouls-imageIO-tiff.tiff")); 

ImageIO.write() 抛出 IllegalArgumentException 因为 bufImg 为空。我不明白我在这里做错了什么。

相反,如果我使用 IOUtils 来写,它工作正常:

IOUtils.write(imgBytes, new FileOutputStream("c:/new-darksouls-io-tiff.tiff"));

请帮助我理解

  1. 为什么 ImageIO 抛出异常
  2. 什么是正确的 API 和实现我想要实现的目标的方法。

最佳答案

例如,如果您想将 PNG 转换为 JPEG,ImageIO 会很有用。由于您不需要操作图像或转换为另一种格式,因此不必为 ImageIO 而烦恼。只需使用 IOUtils.write() 逐字保存 TIFF 数据。

ImageIO.read() 返回空图像,因为它无法读取 TIFF 文件,这可能是因为 TIFF 不是标准的 ImageIO 插件格式之一。此处列出了标准支持的图像格式:

http://docs.oracle.com/javase/6/docs/api/javax/imageio/package-summary.html

附加说明——您发布的代码在内存中缓冲了整个图像。如果您担心有效使用内存,请考虑使用某种 Base64 解码输入流来动态执行解码。这可能看起来像这样:

try (FileOutputStream out = new FileOutputStream("c:/new-darksouls-io-tiff.tiff");
     FileInputStream in = new FileInputStream("C:/tiff-attachment.txt");
     Base64InputStream decodedIn = new Base64InputStream(in)) {

    IOUtils.copy(decodedIn, out);
}

关于java - 使用 IOUtils 和 ImageIO 写入图像文件有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17095739/

相关文章:

java - 为什么 openFileOutput 需要一个 try catch block ?

java - 将父类成员仅限于其直接子类

php - 使用 PHP 提供私有(private)图像

html - 向 div 添加 float-left 类 (Bootstrap 4) 会否定 <an><image></a> 链接

c# - 检查文件是否存在于忽略扩展名的目录中

file-io - Windows 7 上的 RDP 使用什么协议(protocol)通过剪贴板复制文件?

java - 在不使用 Box2D 的情况下在 LibGDX 中制作具有碰撞和重力的游戏

java - 带有 Java 5 的 Jersey

javascript - Jquery 将类添加到最后 5 个元素

java - 如何根据字符串位置读取文件并将其存储在变量中