2010-02-18 15 views

Antwort

9

Zuerst installieren JAI. Dann installieren Sie JAI/ImageIO. Dann tun

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

Können Sie erklären, was mit der nicht standardmäßigen Installation passiert? Normalerweise sind Java-Bibliotheken nur JAR-Dateien, die Sie in Ihren CLASSPATH einfügen, aber JAI installiert auch native DLLs. Wie funktioniert das, wenn Sie auf einem Webserver bereitstellen? –

+2

Sie können auch pure-java JAI erhalten, aber es gibt keinen Grund, dies zu tun, wenn Ihre Plattform vom systemeigenen Code unterstützt wird. Wenn Sie Ihre App auf einem Webserver bereitstellen, müssen auf der JRE des Servers auch die Erweiterungen JAI und JAI/ImageIO installiert sein. –

+0

@ Jonathan Feinberg, müssen Sie die JARs in den Classpath aufnehmen oder macht die Installation der Erweiterungen es Teil der JRE? –

1

Java Advanced Imaging API ist eine gute Bibliothek für Bildmanipulationen

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

+0

Ja, ich schaute mir das an, ich habe ehrlich gesagt keine Ahnung, wie ich es installieren soll. Sie haben eine Download-ZIP, die eine JAR-Datei mit einer EXE-Datei enthält. Das habe ich noch nie zuvor gesehen. –

7

Verwenden imageMagic Java-Bibliotheken wie im4java, ihre Leistung und Qualität ist viel besser als JAI

zum Beispiel:

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

Maven Abhängigkeit für im4java ist

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

Ich stimme zu, dass die Qualität von IM exzellent ist, aber ich wäre sehr nervös, wenn ich es so verwende (weil meiner Meinung nach die technische Qualität nicht gut ist und es zu fatalen Abstürzen kommen kann). Ich würde stattdessen Shell-Out verwenden, um mit ProcessBuilder zu konvertieren, wenn ich IM verwenden würde. –

+1

@giladbu: ImageMagick ist großartig und ich mache es so, wie Jonathan es vorschlägt, aber ich möchte nur den "Qualitäts" -Teil kommentieren: Ich bezweifle sehr, dass JAI ein Image schlechterer Qualität als ImageMagick produzieren würde, wenn * ein * verlustbehaftet * gelesen wird TIFF (sollte das TIFF des OP verlustbehaftet sein). Was PNG betrifft, ist es verlustfrei und JAI kann dort nichts falsch machen. Im TIFF-PNG-Fall bin ich also nicht der Meinung, dass die Qualität von ImageMagick besser ist als die von JAI. Für TIFF-zu-JPG würden wir jetzt über etwas völlig anderes reden und ich würde ImageMagick verwenden, ohne darüber nachzudenken. – SyntaxT3rr0r

+0

Hmm Ich wusste nicht, dass PNGs verlustfrei waren. –

1

Herunterladen JIMI Software Development Kit jimi1_0.zip a nd gesetzt JimiProClasses.zip zu Classpath

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

JIMI ist älter Java-Image-Bibliothek, aber es ist einfach zu bedienen und es gibt keine plattformabhängige Code (keine nativen ausführbaren Dateien, kann es wie Standard-Glas verwenden)

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

} 

} 

wo inMimeType und outMimeType Grafikformate MIME-Typen sind

+1

es funktioniert gut für jpg, jpeg, png, aber es funktioniert nicht für tiff –

0

vielleicht haben Sie diesen Code verwenden können, funktioniert für mich

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

}