2009-12-23 17 views
20

Tôi không biết phải làm gì với hình ảnh TIFF, nhưng tôi không thể đọc hoặc viết bất kỳ tệp nào bằng thư viện ImageIO chuẩn Java thẳng. Có suy nghĩ gì không?Không thể đọc và ghi tệp hình ảnh TIFF bằng cách sử dụng thư viện chuẩn Java ImageIO

Cảm ơn.

+0

Bạn đang sử dụng Java SE? [Java Imaging API] (http://java.sun.com/products/java-media/jai/iio.html) hỗ trợ TIFF. Chi tiết [ở đây] (https://jai-imageio.dev.java.net/). – MPG

+1

Bạn cần [gói JAI] (https://jai.dev.java.net/#Downloads) để xử lý các tệp TIFF. Một ví dụ đơn giản để hiển thị một tệp TIFF: [Hiển thị một TIF] (http://www.rgagnon.com/javadetails/java-0605.html) – RealHowTo

Trả lời

2

Tôi đã thử JAI và nó không hiệu quả với tôi.

Bạn bị kẹt ở đâu? Công việc sau có phù hợp với bạn không?

import java.io.File; 
import java.io.FileOutputStream; 
import java.awt.image.RenderedImage; 
import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 
import javax.media.jai.NullOpImage; 
import javax.media.jai.OpImage; 
import com.sun.media.jai.codec.SeekableStream; 
import com.sun.media.jai.codec.FileSeekableStream; 
import com.sun.media.jai.codec.TIFFDecodeParam; 
import com.sun.media.jai.codec.ImageDecoder; 
import com.sun.media.jai.codec.ImageCodec; 

public class Main { 
    public static void main(String args[]) { 
     File file = new File("input.tif"); 
     try { 
      SeekableStream s = new FileSeekableStream(file); 
      TIFFDecodeParam param = null; 
      ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param); 
      RenderedImage op = new NullOpImage(dec.decodeAsRenderedImage(0), 
               null, 
               OpImage.OP_IO_BOUND, 
               null); 
      FileOutputStream fos = new FileOutputStream("output.jpg"); 
      JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos); 
      jpeg.encode(op.getData()); 
      fos.close(); 
     } 
     catch (java.io.IOException ioe) { 
      System.out.println(ioe); 
     } 
    } 
} 
+2

Khi bạn có jai_imageio.jar trong classpath của mình, bạn chỉ đơn giản là có thể để sử dụng API ImageIO như bình thường – MadProgrammer

-3

Thêm phụ thuộc Maven:

<dependency> 
    <groupId>org.geotoolkit</groupId> 
    <artifactId>geotk-coverageio</artifactId> 
    <version>3.17</version> 
</dependency> 

Mã dụ:

import org.geotoolkit.image.io.plugin.RawTiffImageReader; 

IIORegistry registry = IIORegistry.getDefaultInstance(); 
registry.registerServiceProvider(new RawTiffImageReader.Spi());    

String[] a = ImageIO.getReaderFileSuffixes();  
for (int i=0; i<a.length; i++) { 
System.out.println(a[i]); 
} 

BufferedImage image = ImageIO.read(new File("C:\\mypic.tiff")); 

ImageIO.write(image, "jpg",new File("C:\\out.jpg")); 
ImageIO.write(image, "gif",new File("C:\\out.gif")); 
ImageIO.write(image, "png",new File("C:\\out.png")); 
ImageIO.write(image, "tif",new File("C:\\out.tiff")); 
+0

Tôi e rằng sự phụ thuộc không hoạt động nữa. Có gì làm việc cho tôi: \t com.github.jai-ImageIO \t jai-ImageIO lõi \t 1.3.1 \t (Tôi không thử nó ra với toàn bộ mã của bạn). – DarkPurpleShadow

9

Nếu bạn không thích hoặc không thể sử dụng JAI đối với bất kỳ lý do tôi đã viết một plugin TIFF ImageReader cho ImageIO, có sẵn trên GitHub. Đó là Java thuần túy và không cần bất kỳ lượt cài đặt gốc nào và đi kèm với giấy phép nguồn mở rất thân thiện (BSD).

Nó hỗ trợ bất kỳ tùy chọn TIFF cơ sở nào, cùng với nhiều tiện ích mở rộng tiêu chuẩn. Từ phiên bản 3.1, plugin TIFF cũng có hỗ trợ ghi.

Với lọ thích hợp trong đường dẫn lớp học của bạn, sử dụng có thể đơn giản như:

BufferedImage image = ImageIO.read(inputTIFF); 
// ...modify image (compose, resize, sharpen, etc)... 
ImageIO.write(image, "TIFF", outputTIFF); 
+0

HI haraldK làm thế nào để bạn sử dụng này ??? Tôi không thích JAI ở tất cả, tôi không thể tìm thấy bất kỳ ví dụ về làm thế nào để chuyển đổi một tập tin tiff để jpg. Tôi đã thử: BufferedImage image = ImageIO.read (tệp mới (inFile)); ! ImageIO.viết (hình ảnh, "jpg", tệp mới (outFile))) – delkant

+0

@delkant Điều đó có thể sẽ hoạt động, nếu bạn có mọi thứ được cài đặt đúng cách. Vui lòng xem [hướng dẫn cài đặt] (https://github.com/haraldk/TwelveMonkeys#installing) để biết thêm chi tiết, hoặc gửi một vấn đề (với đầy đủ chi tiết) nếu bạn không thể làm cho nó hoạt động. – haraldK

2

Theo JEP 262: TIFF Image I/O plugin TIFF rằng đã từng là một phần của JAI sẽ có sẵn như là một phần của Java SE, bắt đầu từ Java 9.

Điều đó có nghĩa, sử dụng Java 9, đoạn code sau sẽ chỉ làm việc, không có hàng nhập khẩu phụ hoặc phụ thuộc:

BufferedImage image = ImageIO.read(inputTIFF); 
// ...modify image (compose, resize, sharpen, etc)... 
ImageIO.write(image, "TIFF", outputTIFF); 

Tôi chưa thể xác minh hỗ trợ cho các hương vị TIFF không đường cơ sở trong plugin này, nhưng tôi giả sử ít nhất TIFF cơ sở phải được hỗ trợ đầy đủ.

Các vấn đề liên quan