2016-09-08 1 views
2

Ich möchte 2 JPEG-Bilder in eine TIFF-Datei mit 3 Seiten zu kodieren. Die Spezifikation ist wie folgt.Mutipage TIFF-Erstellung mit verschiedenen Komprimierungen

  1. JPEG mit Qualität 35 des Bildes komprimierte 1
  2. CCITT komprimiertes Bild von Bild 1
  3. CCITT komprimiertes Bild von Bild 2

Ich bin in der Lage für über 3 separate TIFF-Dateien zu erzeugen, Arten. Aber wenn ich versuche, sie zu kombinieren, muss ich eine einzige Kompression geben

, die die Größe erweitert.

Wie stelle ich unterschiedliche Komprimierung auf verschiedene Seiten ein?

+0

Können Sie bitte mehr Code zeigen? Wenn Sie den ImageIO-Teil von JAI verwenden, sollten Sie in der Lage sein, mehrere Seiten als Sequenz zu schreiben und einen separaten Parameter/Komprimierung an jeden 'writeToSequence (img, param)' Aufruf zu übergeben. – haraldK

+1

Ja, ich habe JAI benutzt. Aber jetzt wechselte ich zu [icafe] (https://github.com/dragon66/icafe/) seinen Weg einfacher. – Shenal

+0

Vielen Dank für den Vorschlag. Werde es versuchen – Shenal

Antwort

1

Nach dem Versuch mit JAI. Ich wechselte zu 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

Sie müssen nicht einmal die dritte tiffOptions erstellen, da es das gleiche wie das zweite ist. Die Bibliothek füllt den fehlenden mit dem letzten aus, den du zur Verfügung gestellt hast. – dragon66

+0

Ich sehe. Danke, dass du darauf hingewiesen hast – Shenal

1

den Standard ImageIO-API (mit JAI ImageIO oder anderer TIFF-Plugin), sollten Sie in der Lage sein, es so zu tun:

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(); 
     } 
    } 
} 

Der obige Code getestet wird unter Verwendung der TwelveMonkeys TIFFImageWriter, aber es sollte genauso gut mit dem JAI ImageIO Plugin funktionieren.