【问题标题】:Image compression and ImageIO library图像压缩和 ImageIO 库
【发布时间】:2017-06-28 04:33:43
【问题描述】:

我的应用程序负责使用特定的算法将单个 TIFF 文件拆分为多个较小的文件。一切正常,但让我担心的是应用程序生成的文件在大小上超过了原始文件。

应用程序处理的原始文件总大小约为 26mb,生成的文件总大小等于 387mb!下面是过程的代码 sn-p - 在图像压缩和 ImageIO 库方面,我是一名业余爱好者,并且无法在网络上找到任何有用的东西,因此我想问一下是否有什么可以改变的使这些结果更接近。理想情况下,我想使用与原始相同的压缩方式。

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();
  }
}

}

【问题讨论】:

  • 如果您想将多页 TIFF 拆分为多个单页 TIFF,您可能需要查看 this Q/A,它演示了如何在不解码图像的情况下执行此操作,从而保留原始压缩/文件大小。

标签: java image-processing compression tiff


【解决方案1】:

阅读您的代码我会解释以下内容:

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

所以在您的写作逻辑中,您确实设置了“从输入图像复制压缩”(ImageWriteParam.MODE_COPY_FROM_METADATA)。由于读取的图像本身没有任何压缩信息,因此图像数据应以未压缩的格式写入。

对于压缩的输入图像和未压缩的输出图像,难怪单个图块的大小比输入文件大。尽管输入图像可能在压缩后的页面之间也存在冗余(我对 TIFF 的了解不足以肯定地说),但我认为您更有可能只是在编写未压缩的图像数据出去。

【讨论】:

  • 我已经发布了返回BufferedImage的方法。如何将有关原始文件压缩的​​信息传输到输出文件?有没有办法这样做?我不想降低原始图像的质量。
  • ImagerReader::getImageMetadata(int imageIndex) 返回一个 IIOMetadata。您可能可以在 ImageWriter 中使用它,但是我不知道该怎么做。在您的项目中设置固定压缩值是否可以,还是必须使用与输入文件中相同的值?
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2020-02-29
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多