2008-11-11 11 views
5

Ich habe Probleme beim Umwandeln von PNG in TIFF. Die Konvertierung geht gut, aber das Bild ist riesig. Ich denke, das Problem ist, dass ich die Komprimierung nicht richtig mache? Hat jemand irgendwelche Vorschläge ?? HierTiff-Komprimierung mit Java ImageIO

ist das Codebeispiel

public static void test() throws IOException { 

    // String fileName = "4958813_1"; 
    String fileName = "4848970_1"; 
    String inFileType = ".PNG"; 
    String outFileType = ".TIFF"; 

    ImageIO.scanForPlugins(); 

    File fInputFile = new File("I:/HPF/UU/" + fileName + inFileType); 
    InputStream fis = new BufferedInputStream(new FileInputStream(
      fInputFile)); 
    PNGImageReaderSpi spi = new PNGImageReaderSpi(); 
    ImageReader reader = spi.createReaderInstance(); 

    ImageInputStream iis = ImageIO.createImageInputStream(fis); 
    reader.setInput(iis, true); 
    BufferedImage bi = reader.read(0); 

    TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi(); 
    ImageWriter writer = tiffspi.createWriterInstance(); 
    //Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("TIFF"); 
    //ImageWriter writer = iter.next(); 

    ImageWriteParam param = writer.getDefaultWriteParam(); 
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 

    param.setCompressionType("LZW"); 
    param.setCompressionQuality(0.5f); 
    File fOutputFile = new File("I:\\HPF\\UU\\" + fileName + outFileType); 
    ImageOutputStream ios = ImageIO.createImageOutputStream(fOutputFile); 
    writer.setOutput(ios); 
    writer.write(bi); 

} 

Antwort

9

Writer.getDefaultWriteParam() erstellt nur ein ImageWriteParam Objekt, es verbindet es nicht mit irgendetwas anderem.

Ich sehe keinen Mechanismus in Ihrem Code für Ihr modifiziertes param Objekt, das anschließend in ImageWriter verwendet werden soll.

Ich glaube, dass statt:

writer.write(bi); 

Sie verwenden müssen:

writer.write(null, new IIOImage(bi, null, null), param); 
3

Ich weiß nicht, Java IO, aber in der Regel wollen Sie ein paar Dinge suchen

  1. Können Sie die JPEG-Kompression verwenden, anstatt LZW?
  2. Hier erfahren Sie, wie Sie die TIFF-Streifengröße einstellen - wenn Sie eine kleine Größe wünschen, stellen Sie sie auf die Höhe des Bildes ein.

Edit: Sieht aus wie ein TiffWriteParam die folgenden Methoden

tiffWriteParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT); 
tiffWriteParam.setTiling(imageWidth, imageHeight, 0, 0); 

eingestellt Größe der imagewidth und imageheight Vars zu Ihrem Bild hat. Der Nachteil ist, dass es langsamer wird, Bereiche des Bildes auszulesen.