我正在尝试将多个tif和jpeg文件合并为单个tif文件。
当多个tif文件单独合并为一个tif文件时,该文件的大小几乎与原始多个tif文件的大小相同(10MB的多个tif文件->10MB的单个tif文件)。这太完美了。
然而,当单独将具有许多Jpeg文件tif文件组合成单个tif文件时,与原始文件相比(10MB的多个tif和Jpeg文件导致创建200MB的tif文件),文件大小很大。
有没有办法防止当JPEG文件到来时文件太大?
使用的代码:
List<BufferedImage> bufferedImageList = new ArrayList<>();
for (String page : pages) {
BufferedImage bufferedImage = ImageIO.read(file);
bufferedImageList.add(bufferedImage);
}
String filename = "D:\home\example.tif";
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIF").next();
try (ImageOutputStream output = ImageIO.createImageOutputStream(new File(filename))) {
writer.setOutput(output);
ImageWriteParam params = writer.getDefaultWriteParam();
params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
params.setCompressionType("LZW");
params.setCompressionQuality(1.0f);
writer.prepareWriteSequence(null);
for (BufferedImage image : bufferedImageList) {
writer.writeToSequence(new IIOImage(image, null, null), params);
}
writer.endWriteSequence();
}
writer.dispose();
发布于 2020-09-14 13:14:10
正如@Henry在评论中所写的那样,使用LZW (或任何其他无损)压缩不会实现与有损JPEG (对于“自然”图像)相同的压缩效果。在大多数情况下,这样做会产生更大的文件,但质量最高。在许多情况下,这是可以接受的。
另一种方法是通过指定compressionType
"JPEG"
,在TIFF文件中也使用JPEG压缩。您可能还需要将compressionQuality
设置为较低的值(我相信0.7f
是ImageIO中JPEG的默认设置),以获得更合理的文件大小。
然而,使用JPEG压缩来重新压缩已经被JPEG压缩的图像,将引入"generational loss",因为JPEG通常不能被完美地重建。通过使用与原始表相同的表重新压缩,在技术上可以将这种质量损失保持在最低限度,但这在实践中很难实现,因为编码器/解码器(即,最好的办法是使用与编写原始代码相同的编码器,使用完全相同的参数)。
第三种选择是使用/创建一个特殊用途的TIFF实用程序,它可以在新的TIFF容器中按原样存储JPEG流。这些文件可能不是超高效的TIFF,因为它们不支持条带/平铺等,并且一些非标准输入可能仍然需要重写才能产生有效的TIFF。这将是一项更多的工作,并需要一些关于TIFF格式的深入知识,但肯定是可行的。
https://stackoverflow.com/questions/63872701
复制