2016-09-08 12 views
2

Я хочу кодировать 2 изображения jpeg в файл TIFF с 3 страницами. Спецификация следующая.Создание TIFF Mutipage с различными сжатиями

  1. JPEG сжимаются с качеством 35 изображения 1
  2. CCITT сжатое изображение изображения 1
  3. CCITT сжатое изображение изображения 2

Я способен генерировать отдельные TIFF файлы выше 3 типы. Но когда я пытаюсь их объединить, я должен дать одно сжатие

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

который расширяет размер.

Как установить различное сжатие на разные страницы?

+0

Можете ли вы показать еще какой-нибудь код, пожалуйста? Если вы используете часть ImageIO JAI, вы должны иметь возможность записывать несколько страниц в виде последовательности и передавать отдельный параметр/сжатие для каждого вызова '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, но он должен хорошо работать с плагином JII ImageIO.

 Смежные вопросы

  • Нет связанных вопросов^_^