2010-02-18 8 views
6

Sotto Java qual è il modo migliore per fare la conversione di un file TIF in un PNG?Come posso convertire un TIF in PNG in Java?

La semplicità è preferibile, ma se il modo più semplice è utilizzare una libreria di terze parti, prenderei in considerazione tale soluzione.

risposta

9

In primo luogo, installare JAI. Quindi installare JAI/ImageIO. Poi fare

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

Puoi spiegare cosa sta succedendo con l'installazione non standard? Solitamente le librerie Java sono solo file JAR posizionati all'interno di CLASSPATH, ma JAI installa anche DLL native. Come funziona se si esegue la distribuzione su un server web? –

+2

Puoi anche ottenere JAI pure-java, ma non c'è motivo di farlo, se la tua piattaforma è supportata dal codice nativo. Se si distribuisce l'app su un server Web, anche il JRE del server deve avere anche le estensioni JAI e JAI/ImageIO installate. –

+0

@Jonathan Feinberg, È necessario includere i JAR sul classpath o l'installazione delle estensioni lo rende parte di JRE? –

1

Java Advanced Imaging API è una buona biblioteca per la manipolazione delle immagini

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

+0

Sì, stavo guardando questo, onestamente non ho idea di come installarlo. Hanno un ZIP di download che contiene un file JAR con all'interno un file EXE. Non l'ho mai visto prima. –

7

Usa imageMagic librerie Java come im4java, le loro prestazioni e la qualità è molto meglio allora JAI

ad esempio:

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

dipendenza Maven per im4java è

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

Sono d'accordo sul fatto che la qualità di IM sia eccellente, ma sarei molto preoccupato di usarlo in-process come quello (perché, a mio parere, la qualità dell'ingegneria non è buona e ci possono essere crash fatali). Preferirei shell-out per convertire "convertendo" con ProcessBuilder, se avessi intenzione di usare IM. –

+1

@giladbu: ImageMagick è fantastico e lo faccio come suggerisce Jonathan, ma voglio solo commentare la parte "di qualità": dubito fortemente che JAI possa produrre un'immagine di qualità peggiore di ImageMagick quando * legge * una persona che perde TIFF (il TIFF del PO dovrebbe essere in perdita). Per quanto riguarda PNG, è senza perdite e JAI non può andare male lì. Quindi nel caso TIFF-to-PNG non sono d'accordo sul fatto che la qualità di ImageMagick sarebbe migliore di quella di JAI. Per TIFF-to-JPG ora parleremmo di qualcosa di completamente diverso e userei ImageMagick senza pensarci due volte. – SyntaxT3rr0r

+0

Hmm Non mi ero reso conto che i PNG non avevano perdite. –

1

Scarica il kit di sviluppo software JIMI jimi1_0.zip a ND impostare JimiProClasses.zip al classpath

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

JIMI è più vecchia libreria di immagini di Java, ma è facile da usare e non c'è nessun codice dipendente piattaforma (non eseguibili nativi, può essere utilizzato come vaso standard)

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

} 

} 

dove inMimeType e outMimeType sono formati grafici mimetypes

+1

funziona bene per jpg, jpeg, png ma non funziona per tiff –

0

forse è possibile utilizzare questo codice, funziona per me

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

}