2010-12-17 13 views
8

ImageIO.read (ImagePath) với tập tin này đưa ra một CMMException, tại sao không thể đối phó với Java này tập tin dường như hợp lệ http://www.jthink.net/jaikoz/scratch/front.jpgTại sao tải jpg này bằng cách sử dụng JavaIO cho CMMException?

java.awt.color.CMMException: Invalid image format 
    at sun.awt.color.CMM.checkStatus(Unknown Source) 
    at sun.awt.color.ICC_Transform.<init>(Unknown Source) 
    at java.awt.image.ColorConvertOp.filter(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source) 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at javax.imageio.ImageIO.read(Unknown Source) 
+0

Bạn đang sử dụng phiên bản Java nào? nó làm việc cho jdk 1.5 anf 1.6. – Favonius

+0

Eh, Im sử dụng 1.6.22 trên WIndows 7 –

+0

Ive đã thêm stacktrace, có thể điều đó sẽ làm sáng tỏ nó –

Trả lời

15

Tôi nghĩ rằng tôi có các hang của vấn đề của bạn. Tôi đã kiểm tra hình ảnh bạn đã liên kết (http://www.jthink.net/jaikoz/scratch/front.jpg). Do tiêu chuẩn Exif và JFIF.

khi bạn đang làm một cái gì đó như ImageIO.read('some file'), nó sẽ gọi triển khai mặt trời jpeg mặc định com.sun.imageio.plugins.jpeg.JPEGImageReader. Đã từng gặp sự cố khi tải các tệp JFIF BUG 6488904 (kiểm tra nhận xét về phía cuối).

Theo đặc tả, cả Exif và nhu cầu JFIF rằng phân khúc đánh dấu ứng dụng tương ứng của họ phải được quyền đầu tiên sau SOI (App1 và APP0) , vì vậy nó thực sự là không thể thực hiện mỗi spec cho tệp JPEG phải tuân thủ với cả hai tiêu chuẩn.

Mặc dù nó đã được báo cáo thời gian dài trở lại

Cách giải quyết là sử dụng thư viện JAI (https://jai.dev.java.net/binary-builds.html#Release_builds). Tôi đang sử dụng Java (không có gia tốc gốc) phiên bản.

SeekableStream seekableStream = new FileSeekableStream(new File("front.jpg")); 
ParameterBlock pb = new ParameterBlock(); 
pb.add(seekableStream); 

BufferedImage image = JAI.create("jpeg", pb).getAsBufferedImage(); 

hy vọng điều này sẽ hữu ích.

+0

thx, có vẻ tôi sẽ xem xét nó –

+0

@ user294896: bạn được chào đón. Nếu câu trả lời giải quyết được vấn đề của bạn thì hãy đánh dấu nó là đã được chấp nhận. theo cách đó, nó sẽ nằm ngoài danh sách chưa được trả lời. cảm ơn. – Favonius

+0

có nó hoạt động, tôi chỉ tự hỏi là có một cách để làm điều đó bằng cách sử dụng API công cộng hơn là các lớp Sun bên dưới (chẳng hạn như SeekableStream) –

2

Cũ bưu điện, nhưng để tham khảo trong tương lai:

Lấy cảm hứng từ câu hỏi này và liên kết tìm thấy ở đây, tôi đã viết một plugin JPEGImageReader cho ImageIO có hỗ trợ định dạng ảnh JPEG với các loại hồ sơ ICC màu "xấu" (các "vấn đề" là ý định hiển thị trong cấu hình ICC không tương thích với ColorConvertOp của Java). Đó là Java đơn giản và không yêu cầu JAI. Mã nguồn có sẵn miễn phí tại địa chỉ:

https://github.com/haraldk/TwelveMonkeys/tree/master/imageio/imageio-jpeg

+0

Bạn có thể cung cấp một lời giải thích và ví dụ nhỏ trong GitHub README về cách tích hợp và sử dụng cắm vào? Điều đó thật tuyệt. – Jack

+0

@Tôi sẽ làm điều đó. Ngoài ra, vui lòng gửi các vấn đề về tài liệu bị thiếu tại GitHub, nếu có bất kỳ điều gì cụ thể bạn thích được ghi lại. Nhưng tất cả những gì bạn cần làm là xây dựng dự án bằng Maven và đặt các JAR trong đường dẫn lớp. Bạn sẽ sử dụng nó giống như bạn sử dụng plugin JPEG chuẩn (ví dụ 'ImageIO.read (...)' hoặc 'ImageIO.getImageReaders (...)'). – haraldK

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