我有一个 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"));
请帮助我理解
- 为什么 ImageIO 抛出异常
- 什么是正确的 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/