Java 使用不同压缩创建多页TIFF

Java 使用不同压缩创建多页TIFF,java,image,javax.imageio,jai,icafe,Java,Image,Javax.imageio,Jai,Icafe,我想将2个jpeg图像编码为一个包含3页的TIFF文件。规格如下 JPEG压缩,图像1的质量为35 图像1的CCITT压缩图像 图像2的CCITT压缩图像 我能够为上述3种类型生成单独的tiff文件。但是当我尝试组合它们时,我必须进行一次压缩 param(`params.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);`) 这会扩大尺寸 如何将不同的压缩设置为不同的页面?尝试JAI后。我换了 使用标准ImageIO API(使用JAI

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

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

    param(`params.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);`) 
    
    这会扩大尺寸


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

    尝试JAI后。我换了


    使用标准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();
            }
        }
    }
    
    publicstaticvoidmain(字符串[]args)引发IOException{
    List images=Arrays.asList(
    新的BuffereImage(100100,BuffereImage.TYPE_INT_ARGB),
    新的BuffereImage(100100,BuffereImage.TYPE_BYTE_BINARY),
    新的BuffereImage(100100,BuffereImage.TYPE_BYTE_BINARY)
    );
    列表压缩=Arrays.asList(“JPEG”、“CCITT.4”、“CCITT.4”);
    try(ImageOutputStream outputStream=ImageIO.createImageOutputStream(新文件(args[0])){
    ImageWriter tiffWriter=ImageIO.getImageWritersByFormatName(“TIFF”).next();//假定已安装TIFF插件
    tiffWriter.setOutput(outputStream);
    如果(!images.isEmpty()){
    tiffWriter.prepareWriteSequence(null);//使用默认的流元数据
    对于(int i=0;i

    上面的代码是使用测试的,但是它应该与JAI-ImageIO插件一起工作

    请再给我看一些代码好吗?如果您使用JAI的ImageIO部分,您应该能够将多个页面作为一个序列写入,并向每个
    writeToSequence(img,param)
    调用传递单独的参数/压缩。是的,我使用了JAI。但现在我改用更简单的方式。谢谢你的建议。您甚至不需要创建第三个选项,因为它与第二个选项相同。库将用您提供的最后一个填充缺少的。
    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();
            }
        }
    }