2016-09-08 61 views
2

我想將2個jpeg圖像編碼爲3頁的TIFF文件。規格如下。用不同的壓縮方式創建多頁TIFF

  1. JPEG壓縮用的圖像的35質量1個
  2. CCITT圖像的壓縮圖像1
  3. 圖像的CCITT壓縮圖像2

我能夠生成單獨的TIFF文件爲上述3類型。但是,當我嘗試將它們合併時,我必須給予單個壓縮

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

它擴大了尺寸。

如何爲不同的頁面設置不同的壓縮率?

+0

請問您能再展示一些代碼嗎?如果您正在使用JAI的ImageIO部分,則應該能夠將多個頁面作爲序列寫入,並將單獨的參數/壓縮傳遞給每個'writeToSequence(img,param)'調用。 – haraldK

+1

是的,我正在使用JAI。但是現在我更容易更改爲[icafe](https://github.com/dragon66/icafe/)。 – Shenal

+0

謝謝你的建議。將嘗試 – Shenal

回答

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(); 
+0

你甚至不需要創建第三個tiffOptions,因爲它與第二個相同。圖書館將填補你提供的最後一個。 – dragon66

+0

我明白了。謝謝你指出 – Shenal

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插件一樣工作。