2010-02-18 18 views

Odpowiedz

9

Najpierw należy zainstalować JAI. Następnie zainstaluj JAI/ImageIO. Następnie zrobić

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

Czy możesz wyjaśnić, co dzieje się z niestandardową instalacją? Zwykle biblioteki Java to tylko pliki JAR, które umieszczasz w swoim CLASSPATH, ale JAI instaluje również natywne biblioteki DLL. Jak to działa, jeśli wdrażasz na serwerze internetowym? –

+2

Możesz również uzyskać czysto Java JAI, ale nie ma powodu, aby to zrobić, jeśli twoja platforma jest obsługiwana przez natywny kod. Jeśli wdrażasz aplikację na serwerze sieciowym, środowisko JRE serwera musi również mieć zainstalowane rozszerzenia JAI i JAI/ImageIO. –

+0

@ Jonathan Feinberg, Czy musisz uwzględnić pliki JAR w ścieżce klas lub czy instalowanie rozszerzeń jest częścią środowiska JRE? –

1

Java zaawansowane API do przetwarzania obrazu jest dobra biblioteka do manipulacji obrazu

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

+0

Tak, patrzyłem na to, szczerze nie mam pojęcia, jak to zainstalować. Mają pobrany plik ZIP, który zawiera plik JAR z plikiem EXE wewnątrz. Nigdy wcześniej tego nie widziałem. –

7

Zastosowanie imageMagic biblioteki Java jak im4java, ich wydajność i jakość jest znacznie lepsza niż JAI

na przykład:

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

zależność Maven dla im4java jest

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

Zgadzam się, że jakość IM jest znakomita, ale byłbym bardzo zdenerwowany, jeśli chodzi o używanie jej w procesie w ten sposób (ponieważ, moim zdaniem, jakość techniczna nie jest dobra i może dojść do fatalnych awarii). Zamiast tego użyłbym metody "convert" przy użyciu ProcessBuilder, gdybym używał komunikatora. –

+1

@giladbu: ImageMagick jest świetny i robię to tak, jak sugeruje Jonathan, ale chcę tylko wypowiedzieć się na temat "jakości": bardzo wątpię, że JAI dałoby obraz gorszej jakości niż ImageMagick, gdy * czytając * stratę TIFF (gdyby TIFF z PO był stratny). Jeśli chodzi o PNG, jest on bezstratny i JAI nie może się nie udać. Tak więc w przypadku TIFF-PNG nie zgadzam się, że jakość ImageMagick byłaby lepsza niż JAI. W przypadku TIFF-JPG mówimy teraz o czymś zupełnie innym i używałbym ImageMagick bez zastanawiania się nad tym. – SyntaxT3rr0r

+0

Hmm Nie zdawałem sobie sprawy, że PNG były bezstratne. –

1

Pobierz Jimi Software Development Kit jimi1_0.zip a nd ustawić JimiProClasses.zip na ścieżce klas

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

JIMI jest starsze biblioteki Java obrazu, ale jest łatwy w obsłudze i nie jest zależny od platformy kod (brak rodzimych plików wykonywalnych, można go używać jak standardowy słoika)

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

} 

} 

gdzie inMimeType i outMimeType są grafiki formaty MIMETYPES

+1

działa poprawnie dla jpg, jpeg, png, ale nie działa dla tiff –

0

może można użyć tego kodu, działa na mnie

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

} 
Powiązane problemy