1

我有一个 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 和方法。
4

1 回答 1

3

例如,如果您想将 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);
}
于 2013-06-13T19:55:43.077 回答