我有一个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"));
请帮助我理解
答案 0 :(得分: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);
}