我的应用程序负责使用特定的alghoritm将单个TIFF文件拆分为多个较小的文件。一切正常,但我关注的是,应用程序生成的文件大小超过了原始文件。
应用程序处理的原始文件总大小约为26mb,生成的文件总大小为387mb!下面是一个过程的代码片段 - 我是一个关于图像压缩和ImageIO库的amator,并且无法在网络上找到任何有用的东西,因此我想问一下我是否可以改变一些东西那些结果更接近。理想情况下,我想使用与原始压缩相同的压缩。
final ImageWriter writer = ImageIO.getImageWritersByFormatName(resultsExtension).next();
final ImageWriteParam writeParams = writer.getDefaultWriteParam();
writeParams.setCompressionMode(ImageWriteParam.MODE_COPY_FROM_METADATA);
BufferedImage page = ImageUtils.getSinglePageFromTiffFile(documentToSplit, currentPageIndex);
while (currentPageIndex < pagesQty) {
OutputStream outStream = null;
ImageOutputStream imgOutStream = null;
try {
outStream = new FileOutputStream(newDocFile);
imgOutStream = ImageIO.createImageOutputStream(outStream);
writer.setOutput(imgOutStream);
writer.prepareWriteSequence(null);
writer.writeToSequence(new IIOImage(page, null, null), writeParams);
currentPageIndex++;
if (CONDITION) {
writer.endWriteSequence();
break;
}
writer.writeToSequence(new IIOImage(page, null, null), writeParams);
currentPageIndex++;
}
} finally {
if (imgOutStream != null) {
imgOutStream.close();
}
if (outStream != null) {
outStream.close();
}
}
}
getSinglePageFromTiffFile
方法:
public static BufferedImage getSinglePageFromTiffFile(File file, int pageIndex)
throws IOException {
ImageInputStream is = ImageIO.createImageInputStream(file);
ImageReader reader;
try {
reader = ImageIO.getImageReaders(is).next();
reader.setInput(is);
return reader.read(pageIndex);
} finally {
if (is != null) {
is.close();
}
}
}
答案 0 :(得分:1)
阅读你的代码我解释如下:
在我看来,您正在从源图像读取到未压缩的数据结构(BufferedImage)。此数据结构似乎没有任何有关数据压缩的信息。
所以在你的写作逻辑中,你确实已经从输入图像中设置了#34;复制压缩&#34; (ImageWriteParam.MODE_COPY_FROM_METADATA)。由于读取的图像本身不具有任何压缩信息,因此应以未压缩格式写出图像数据。
使用压缩的输入图像和未压缩的输出图像,难怪单个图块的大小比输入文件大。虽然有可能,输入图像也有压缩的页面之间的冗余(我不知道TIFF足以说明这一点),我说你更有可能只是写出未压缩的图像数据。