使用不同的压缩创建多页面TIFF

时间:2016-09-08 09:43:03

标签: java image javax.imageio jai icafe

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

  1. JPEG压缩,质量为35的图像1
  2. CCITT压缩图像1的图像
  3. CCITT压缩图像2的图像
  4. 我可以为3种以上类型生成单独的tiff文件。但是当我尝试将它们组合起来时,我必须进行一次压缩

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

    扩大了尺寸。

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

2 个答案:

答案 0 :(得分:1)

尝试使用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(); 

答案 1 :(得分: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插件同样有效。