2010-02-18 21 views

Respuesta

9

primer lugar, instale JAI. Luego instale JAI/ImageIO. Luego hacer

public static void main(final String[] args) throws Exception 
{ 
    final BufferedImage tif = ImageIO.read(new File("test.tif")); 
    ImageIO.write(tif, "png", new File("test.png")); 
} 
+0

¿Puede explicar qué está pasando con la instalación no estándar? Por lo general, las bibliotecas Java son solo archivos JAR que usted coloca dentro de CLASSPATH, pero JAI también instala archivos DLL nativos. ¿Cómo funciona esto si se implementa en un servidor web? –

+2

También puede obtener JAI puro-java, pero no hay razón para hacerlo, si su plataforma es compatible con el código nativo. Si despliega su aplicación en un servidor web, entonces el JRE del servidor también debe tener las extensiones JAI y JAI/ImageIO instaladas también. –

+0

@Jonathan Feinberg, ¿Necesita incluir los JAR en el classpath o la instalación de las extensiones lo hace parte del JRE? –

1

API de Java avanzada de imágenes es una buena biblioteca para la manipulación de imágenes

http://java.sun.com/products/java-media/jai/iio.html

+0

Sí, estaba mirando eso, sinceramente no tengo idea de cómo instalarlo. Tienen un ZIP de descarga que contiene un archivo JAR con un archivo EXE dentro de él. Nunca había visto eso antes. –

7

Uso imageMagic bibliotecas Java, como im4java, su rendimiento y la calidad es mucho mejor que JAI

por ejemplo:

import org.im4java.core.ConvertCmd; 
import org.im4java.core.IMOperation; 

public static void convertTifToPng(File inputImage, File outputImage){ 
    IMOperation op = new IMOperation(); 
    op.addImage(); //place holder for input file 
    op.addImage(); //place holder for output file 

    ConvertCmd convert = new ConvertCmd(); 
    convert.run(op, new Object[]{inputImage.getAbsolutePath(), outputImage.getAbsolutePath()}); 
} 

dependencia Maven para im4java es

<dependency> 
    <groupId>im4java</groupId> 
    <artifactId>im4java</artifactId> 
    <version>0.98.0</version> 
</dependency> 
+1

Acepto que la calidad de la mensajería instantánea es excelente, pero me pondría muy nerviosa sobre su uso en proceso (porque, en mi opinión, la calidad de la ingeniería no es buena y puede haber fallas fatales). En cambio, pagaría 'convertir' usando ProcessBuilder, si fuera a usar mensajería instantánea. –

+1

@giladbu: ImageMagick es genial y lo hago de la forma en que Jonathan sugiere, pero solo quiero comentar sobre la parte de "calidad": dudo mucho que JAI produzca una imagen de peor calidad que ImageMagick cuando * leyendo * una pérdida TIFF (si el TIFF del OP tiene pérdida). En cuanto a PNG, no tiene pérdidas y JAI no puede equivocarse allí. Entonces en el caso de TIFF a PNG no estoy de acuerdo en que la calidad de ImageMagick sea mejor que JAI. Para TIFF-a-JPG ahora estaríamos hablando de algo completamente diferente y usaría ImageMagick sin pensarlo dos veces. – SyntaxT3rr0r

+0

Hmm. No me di cuenta de que los PNG no tenían pérdida. –

1

Descargar JIMI Software Development Kit jimi1_0.zip a nd establecer JimiProClasses.zip a la ruta de clases

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#7259-jimi_sdk-1.0-oth-JPR

JIMI es mayor biblioteca de imágenes de Java, pero es fácil de usar y no hay ningún código dependiente de la plataforma (no ejecutables nativos, puede usarlo como sacudidas estándar)

import java.awt.Image; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 

import com.sun.jimi.core.Jimi; 

public class JIMIImageConverter { 

public static byte[] convert(byte[] inBytes, String inMimeType, String outMimeType) throws Exception{ 

    Image rawImage = Jimi.getImage(new ByteArrayInputStream(inBytes), inMimeType); 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    Jimi.putImage(outMimeType, rawImage, outputStream); 
    return outputStream.toByteArray(); 

} 

} 

donde inMimeType y outMimeType son gráficos formatos tipos MIME

+1

funciona bien para jpg, jpeg, png pero no funciona para tiff –

0

tal vez usted puede utilizar este código, funciona para mí

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.awt.image.RenderedImage; 
import java.awt.image.renderable.ParameterBlock; 
import java.io.File; 
import java.io.IOException; 

import javax.media.jai.JAI; 
import javax.media.jai.RenderedOp; 

import com.sun.media.jai.codec.FileSeekableStream; 
import com.sun.media.jai.codec.ImageCodec; 
import com.sun.media.jai.codec.ImageDecoder; 
import com.sun.media.jai.codec.SeekableStream; 

public class ImageConvert { 

    public static RenderedImage[] readMultiPageTiff(String fileName)throws IOException{ 
      File file = new File(fileName); 
      SeekableStream seekableStream = new FileSeekableStream(file); 
      ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", seekableStream, null); 
      int numPages = decoder.getNumPages(); 
      RenderedImage image[]= new RenderedImage[numPages]; 
      int count = 0; 
      for(int i=0;i<decoder.getNumPages();i++){ 
       image[i] = decoder.decodeAsRenderedImage(i); 
       count++; 
      } 

      String newFolderName; 
      String s3 = fileName; 
      String [] temp = null; 
      temp = s3.split("\\."); 


      int j; 
       j = 0; 
       do{ 
        newFolderName = temp[j]; 
        String spoonFeeding = newFolderName; 
        File f = new File(spoonFeeding); 
        f.mkdirs(); 
        j++; 
       }while (j<1); 

      for (int i = 0; i < count; i++) { 
       RenderedImage page = decoder.decodeAsRenderedImage(i); 
       File fileObj = new File(newFolderName+"/" + (i+1) + ".png"); 
       System.out.println("Saving " + fileObj.getCanonicalPath()); 
       ParameterBlock parBlock = new ParameterBlock(); 
       parBlock.addSource(page); 
       parBlock.add(fileObj.toString()); 
       parBlock.add("png"); 
       RenderedOp renderedOp = JAI.create("filestore",parBlock); 
       renderedOp.dispose(); 
      } 
      return image; 
     } 

} 
Cuestiones relacionadas