图像压缩和ImageIO库

时间:2017-06-27 19:36:17

标签: java image-processing compression tiff

我的应用程序负责使用特定的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();
  }
}

}

1 个答案:

答案 0 :(得分:1)

阅读你的代码我解释如下:

在我看来,您正在从源图像读取到未压缩的数据结构(BufferedImage)。此数据结构似乎没有任何有关数据压缩的信息。

所以在你的写作逻辑中,你确实已经从输入图像中设置了#34;复制压缩&#34; (ImageWriteParam.MODE_COPY_FROM_METADATA)。由于读取的图像本身不具有任何压缩信息,因此应以未压缩格式写出图像数据。

使用压缩的输入图像和未压缩的输出图像,难怪单个图块的大小比输入文件大。虽然有可能,输入图像也有压缩的页面之间的冗余(我不知道TIFF足以说明这一点),我说你更有可能只是写出未压缩的图像数据。