2008-11-11 24 views
5

Tengo problemas para convertir un png a tiff. La conversión va bien, pero la imagen es enorme. Creo que el problema es que no estoy haciendo la compresión correctamente? ¿¿Alguien tiene alguna sugerencia??Compresión de Tiff con Java ImageIO

Aquí está el ejemplo de código

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

} 

Respuesta

9

Writer.getDefaultWriteParam() solo crea un objeto ImageWriteParam, no lo vincula a ninguna otra cosa.

No veo ningún mecanismo en su código para su objeto modificado param que se utilizará posteriormente en el ImageWriter.

creo que en lugar de:

writer.write(bi); 

es necesario utilizar:

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

No sé Java IO, pero en general que desea mirar un par de cosas

  1. ¿Se puede utilizar la compresión JPEG en lugar de LZW?
  2. Vea cómo configurar el tamaño de la tira TIFF: si el tamaño pequeño es el que desea, ajústelo a la altura de la imagen.

Editar: Se parece a un TiffWriteParam tiene los siguientes métodos

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

establecen el ImageWidth y ImageHeight vars al tamaño de su imagen. La desventaja es que será más lento leer regiones de la imagen.

Cuestiones relacionadas