2010-02-18 46 views

Trả lời

9

Đầu tiên, cài đặt JAI. Sau đó cài đặt JAI/ImageIO. Sau đó làm

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

Bạn có thể giải thích những gì đang diễn ra với cài đặt không chuẩn? Thông thường các thư viện Java chỉ là các tệp JAR mà bạn đặt bên trong CLASSPATH của bạn, nhưng JAI cũng cài đặt các tệp DLL gốc. Cách này hoạt động như thế nào nếu bạn triển khai tới một máy chủ web? –

+2

Bạn cũng có thể nhận được JAI thuần java, nhưng không có lý do gì để làm như vậy, nếu nền tảng của bạn được hỗ trợ bởi mã gốc. Nếu bạn triển khai ứng dụng của mình lên một máy chủ web, thì JRE của máy chủ cũng phải có phần mở rộng JAI và JAI/ImageIO được cài đặt. –

+0

@ Jonathan Feinberg, Bạn có cần phải bao gồm các JAR trên đường dẫn lớp hoặc cài đặt các phần mở rộng làm cho nó trở thành một phần của JRE không? –

1

Java Advanced Imaging API là một thư viện tốt cho thao tác hình ảnh

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

+0

Vâng tôi đã nhìn vào điều đó, tôi thành thật không có ý tưởng làm thế nào để cài đặt nó. Họ có một ZIP tải về có chứa một tập tin JAR với một tập tin EXE bên trong của nó. Tôi chưa bao giờ thấy điều đó trước đây. –

7

Sử dụng imageMagic thư viện java như im4java, hiệu suất và chất lượng của họ là tốt hơn nhiều sau đó JAI

ví dụ:

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

phụ thuộc maven cho im4java là

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

Tôi đồng ý rằng chất lượng IM là tuyệt vời, nhưng tôi sẽ rất lo lắng về việc sử dụng nó trong quá trình như vậy (bởi vì, theo ý kiến ​​của tôi, chất lượng kỹ thuật không tốt, và có thể có tai nạn nghiêm trọng). Thay vào đó, tôi sẽ chuyển thành 'convert' bằng cách sử dụng ProcessBuilder, nếu tôi định sử dụng IM. –

+1

@giladbu: ImageMagick thật tuyệt vời và tôi làm theo cách Jonathan đề xuất nhưng tôi chỉ muốn bình luận về phần "chất lượng": Tôi rất nghi ngờ rằng JAI sẽ tạo ra một hình ảnh có chất lượng kém hơn ImageMagick khi * đọc * mất dữ liệu TIFF (nên TIFF của OP bị mất). Đối với PNG, nó là không mất mát và JAI không thể đi sai ở đó. Vì vậy, trong trường hợp TIFF-to-PNG, tôi không đồng ý rằng chất lượng của ImageMagick sẽ tốt hơn JAI. Đối với TIFF-to-JPG bây giờ chúng ta sẽ nói về một cái gì đó hoàn toàn khác nhau và tôi sẽ sử dụng ImageMagick mà không cần suy nghĩ hai lần về nó. – SyntaxT3rr0r

+0

Hmm Tôi không nhận ra rằng PNG không bị mất dữ liệu. –

1

Tải xuống Bộ phát triển phần mềm JIMI jimi1_0.zip a nd thiết JimiProClasses.zip vào classpath của bạn

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

JIMI là thư viện hình ảnh java cũ hơn, nhưng nó rất dễ dàng để sử dụng và không có mã phụ thuộc nền tảng (không thực thi bản xứ, có thể sử dụng nó như bình chuẩn)

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

} 

} 

nơi inMimeType và outMimeType là định dạng đồ họa mimetypes

+1

nó hoạt động tốt cho jpg, jpeg, png nhưng nó không hoạt động cho tiff –

0

có lẽ bạn có thể sử dụng mã này, làm việc cho tôi

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

}