2013-03-15 43 views
7

gần đây tôi đang gặp sự cố khi cố gắng hiển thị tệp hình ảnh. Rất tiếc, định dạng hình ảnh là định dạng TIFF không được trình duyệt web chính hỗ trợ (vì tôi chỉ biết Safari hỗ trợ định dạng này). Do ràng buộc nhất định, tôi phải chuyển đổi định dạng này sang định dạng khác được hỗ trợ bởi trình duyệt chính. Tuy nhiên, nó mang lại rất nhiều vấn đề cho tôi khi tôi cố gắng chuyển đổi định dạng.Cách chuyển đổi TIFF sang JPEG/PNG trong java

tôi đã tìm kiếm thông qua các trang web và mặc dù có được đăng vấn đề tương tự trong liên kết này How do I convert a TIF to PNG in Java? "nhưng tôi không thể có kết quả vì nó được đề nghị ..

Do đó tôi nâng Câu hỏi này một lần nữa để mong rằng có thể có lời giải thích tốt hơn và hướng dẫn từ tất cả các bạn ..

có vài vấn đề tôi đang phải đối mặt trong quá trình đi qua với giải pháp mà đề xuất:

1) theo câu trả lời rằng đề nghị của Jonathan Feinberg, nó cần cài đặt JAI và JAI/Im ageIO. Tuy nhiên, sau khi tôi cài đặt cả hai, tôi vẫn không thể nhập tệp trong Netbean 7.2. NetBean 7.2 vẫn đề nghị nhập thư viện imageIO mặc định.

2) khi tôi đang sử dụng thư viện ImageIO mặc định Đọc phương thức, nó sẽ trả về giá trị NULL và tôi không thể tiếp tục tiến hành.

3) Tôi cũng đã thử phương pháp khác như chuyển đổi tệp TIFF thành tệp BIN bằng cách sử dụng phương thức BufferedOutputStream nhưng tệp kết quả lớn hơn 11 MB quá lớn để tải và kết thúc tải không thành công.

if (this.selectedDO != null) { 
     String tempDO = this.selectedDO.DONo; 
     String inPath = "J:\\" + tempDO + ".TIF"; 
     String otPath = "J:\\" + tempDO + ".bin"; 

     File opFile = new File(otPath); 

     File inFile = new File(inPath); 

     BufferedInputStream input = null; 
     BufferedOutputStream output = null; 
     try { 
      input = new BufferedInputStream(new FileInputStream(inPath), DEFAULT_BUFFER_SIZE); 
      output = new BufferedOutputStream(new FileOutputStream(otPath), DEFAULT_BUFFER_SIZE); 

      byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
      int length; 
      while ((length = input.read(buffer)) > 0) { 
       output.write(buffer, 0, length); 
      } 

     } finally { 
      try { 
       output.flush(); 
       output.close(); 
       input.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

Do đó, hy vọng có thể nhận được trợ giúp và tư vấn từ bạn để tôi có thể chuyển định dạng TIFF sang định dạng khác như JPEG/PNG.

+0

Tak xem Imagemagick (http://www.imagemagick.org/script/index.php). Đây là nội dung java cho ImageMagic (http://www.jmagick.org/index.html) – pepuch

+0

là nó tương tự như ImageMagick được đề xuất trong [link] (http://stackoverflow.com/questions/2291358/how- do-i-convert-a-tif-to-png-in-java) tôi đã thử phương pháp được đề xuất trong bài đăng đó bằng cách sử dụng ImageMagick, nhưng nó không thành công khi chuyển đến 'ConvertCmd convert = new ConvertCmd(); ' – jc88

Trả lời

13

Đã trải qua một số nghiên cứu và thử nghiệm, đã tìm thấy một phương pháp để chuyển đổi TIFF thành JPEG và xin lỗi vì đã chờ quá lâu, chỉ tải lên câu trả lời này.

 SeekableStream s = new FileSeekableStream(inFile); 
     TIFFDecodeParam param = null; 
     ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param); 
     RenderedImage op = dec.decodeAsRenderedImage(0); 

     FileOutputStream fos = new FileOutputStream(otPath); 
     JPEGEncodeParam jpgparam = new JPEGEncodeParam(); 
     jpgparam.setQuality(67); 
     ImageEncoder en = ImageCodec.createImageEncoder("jpeg", fos, jpgparam); 
     en.encode(op); 
     fos.flush(); 
     fos.close(); 

p/s: otPath có nghĩa là đường dẫn bạn muốn lưu trữ hình ảnh JPEG của mình. Ví dụ: "C: /image/abc.JPG"; inFile là tệp đầu vào là tệp TIFF

Ít nhất phương pháp này hoàn toàn khả thi đối với tôi. Nếu có phương pháp nào khác tốt hơn, vui lòng chia sẻ cùng với chúng tôi.

Cảm ơn và Kính trọng,

+1

Bạn có thể lấy bình yêu cầu từ đây: https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/com/sun/media/jai- codec/1.1.3/jai-codec-1.1.3.jar –

+0

Điều này làm việc tốt cho hình ảnh nhỏ, như tôi đã thử với một hình ảnh của 5,7 KB và là OK, nhưng sau đó đã thử với một hình ảnh của 80 KB và tôi nhận được java. lang.IndexOutOfBoundsException. Bất kỳ giúp đỡ? –

+0

nó hoạt động nhờ ... – ELITE

0

Trước tiên, hãy xem What is the best java image processing library/approach?. Đối với mã của bạn, bạn có thể sử dụng

javax.imageio.ImageIO.write(im, type, represFile); 

như bạn có thể thấy trong write an image to file example.

+0

tôi đã được thử các ví dụ từ ** MKYong ** nhưng khi đến nó ImageIO.Read, nó trở về tôi null nguyên nhân không thể đọc định dạng TIF .. nếu tôi đọc JPG và PNG sẽ không có một vấn đề .. bất cứ điều gì đi trơn tru nhưng chỉ khi cố gắng đọc định dạng TIFF .. – jc88

+0

Xem http://stackoverflow.com/questions/2898311/reading-and-writing-out-tiff-image-in-java, nó có thể hữu ích. – user1929959

+0

Cảm ơn đề xuất của bạn, tôi không thể thêm JAI jar mặc dù tôi đã bao gồm trong CLASSPATH của tôi nhưng vẫn không thể nhập nó..có thể bạn cung cấp thêm thông tin về cách bao gồm JAI jar? rất cảm kích với bạn giúp đỡ – jc88

1
  1. Thêm phụ thuộc

    <dependency> 
    <groupId>com.github.jai-imageio</groupId> 
    <artifactId>jai-imageio-core</artifactId> 
    <version>1.3.1</version> </dependency> 
    

https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core

https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core/1.3.1

  1. Mã hóa

    final BufferedImage tif = ImageIO.read(new File("test.tif")); 
    ImageIO.write(tif, "png", new File("test.png")); 
    
+1

Điều gì về các tệp Tif nhiều trang? bạn có thể sử dụng lib này với tif có nhiều hơn một trang không? bạn có thể chia sẻ một số mã không? cảm ơn. – delkant

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