【问题标题】:Mutipage TIFF creation with different compressions使用不同压缩创建 Mutipage TIFF
【发布时间】:2017-01-16 04:32:48
【问题描述】:

我想将 2 个 jpeg 图像编码为一个 3 页的 TIFF 文件。规格如下。

  1. JPEG 压缩,图像 1 的质量为 35
  2. 图像 1 的 CCITT 压缩图像
  3. 图像 2 的 CCITT 压缩图像

我能够为以上 3 种类型生成单独的 tiff 文件。但是当我尝试组合它们时,我必须进行一次压缩

param(`params.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);`) 

扩大尺寸。

如何为不同的页面设置不同的压缩方式?

【问题讨论】:

  • 你能再显示一些代码吗?如果您使用 JAI 的 ImageIO 部分,您应该能够将多个页面编写为一个序列,并将单独的参数/压缩传递给每个 writeToSequence(img, param) 调用。
  • 是的,我使用的是 JAI。但现在我改为icafe 更容易。
  • 感谢您的建议。会试试的

标签: java image javax.imageio jai icafe


【解决方案1】:

使用标准 ImageIO API(使用 JAI ImageIO 或其他 TIFF 插件),您应该可以这样做:

public static void main(String[] args) throws IOException {
    List<BufferedImage> images = Arrays.asList(
            new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB),
            new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_BINARY),
            new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_BINARY)
    );

    List<String> compression = Arrays.asList("JPEG", "CCITT T.4", "CCITT T.4");

    try (ImageOutputStream outputStream = ImageIO.createImageOutputStream(new File(args[0]))) {
        ImageWriter tiffWriter = ImageIO.getImageWritersByFormatName("TIFF").next(); // Assumes TIFF plugin installed
        tiffWriter.setOutput(outputStream);

        if (!images.isEmpty()) {
            tiffWriter.prepareWriteSequence(null); // Use default stream metadata

            for (int i = 0; i < images.size(); i++) {
                // Set up explicit compression for each image
                ImageWriteParam param = tiffWriter.getDefaultWriteParam();
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                String compressionType = compression.get(i);
                param.setCompressionType(compressionType);

                if ("JPEG".equals(compressionType)) {
                    param.setCompressionQuality(.35f);
                }

                tiffWriter.writeToSequence(new IIOImage(images.get(i), null, null), param); // Ignoring thumbnail and metadata for now
            }

            tiffWriter.endWriteSequence();
        }
    }
}

上面的代码是使用TwelveMonkeys TIFFImageWriter 测试的,但它应该同样适用于 JAI ImageIO 插件。

【讨论】:

    【解决方案2】:

    在尝试使用 JAI 之后。我切换到icafe

        BufferedImage[] images = new BufferedImage[3];
        images[0]=compressedFront;
        images[1]=frontBinaryImage;
        images[2]=backBinaryImage;
    
    
        ImageParam.ImageParamBuilder builder = ImageParam.getBuilder();
    
        TIFFOptions tiffOptions = new TIFFOptions();
        tiffOptions.setTiffCompression(Compression.JPG);
        tiffOptions.setJPEGQuality(35);
    
    
        ImageParam[] param = new ImageParam[3];
        param[0] =  builder.colorType(ImageColorType.GRAY_SCALE).imageOptions(tiffOptions).build();
    
        tiffOptions = new TIFFOptions(tiffOptions); // Copy constructor
        tiffOptions.setTiffCompression(Compression.CCITTFAX4);
    
    
        param[1] =  builder.colorType(ImageColorType.BILEVEL).imageOptions(tiffOptions).build();
    
        tiffOptions = new TIFFOptions(tiffOptions);
        tiffOptions.setTiffCompression(Compression.CCITTFAX4);
    
        param[2] = builder.colorType(ImageColorType.BILEVEL).imageOptions(tiffOptions).build();
    
        TIFFTweaker.writeMultipageTIFF(rout, param, images);
    
        rout.close();
        fout.close(); 
    

    【讨论】:

    • 您甚至不需要创建第三个 tiffOptions,因为它与第二个相同。图书馆将用您提供的最后一个来填补缺失的一个。
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 2015-02-23
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多