2012-05-02 34 views
16

Xin lỗi vì tiêu đề hơi mơ hồ, tôi không thể tìm ra từ khóa nào ở đây. Thiết lập khá đơn giản, tôi đang mở một hình ảnh vớiImageIO.read ngoại lệ đối số bất hợp pháp - dải raster/thành phần không gian màu?

ImageIO.read(new File(filename)); 

Điều này làm việc cho hầu hết các tệp, tuy nhiên, tôi có thể nhận được IllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match". Hình ảnh này được lấy thông qua wget trên một URL Flickr hợp lệ, và tôi đã sử dụng các hình ảnh khác thu được theo cách này, vì vậy phương pháp để có được hình ảnh có vẻ như về nguyên tắc. Tôi không chắc chắn nguyên nhân gây ra ngoại lệ.

Giải pháp thay thế có thể chấp nhận được - Tôi không bị làm phiền với việc sử dụng ImageIO nói riêng và hình ảnh trông đẹp mắt. Tôi chỉ cần làm cho nó được đọc mà không có Java freaking ra!

Dưới đây là hình ảnh trong câu hỏi, trong trường hợp đó là của bất kỳ sử dụng:

enter image description here

+0

Tôi gặp lỗi tương tự (ít nhất là khi sử dụng 'ImageIO.read (URL mới (" http://i.imgur.com/rC6Jk.jpg "));'). Đây có phải là hình ảnh B/W duy nhất bạn đang xử lý không? –

+0

Khó nói - bản chất của quá trình truy xuất hình ảnh là rất không bị suy giảm (ý tưởng là phần mềm là tự trị!) Đây là phần mềm duy nhất có độ bão hòa thấp như vậy. Bạn có nghĩ đó là nguyên nhân không? – mtrc

+0

Bạn đã tìm thấy giải pháp nào cho điều này? –

Trả lời

11

Vì vậy, tôi đã có vấn đề này cùng và thấy rằng hình ảnh là màu xám quy mô và rằng việc thực hiện ImageIO.read mặc định đã không tìm ra điều đó vì siêu dữ liệu hình ảnh không hoàn toàn như mong đợi. Tôi đã viết một công việc xung quanh mà thử lại tải như 'BufferedImage.TYPE_BYTE_GRAY' nếu nó không tải chính.

  Iterator<ImageReader> iter = ImageIO.getImageReaders(stream); 

     Exception lastException = null; 
     while (iter.hasNext()) { 
      ImageReader reader = null; 
      try { 
       reader = (ImageReader)iter.next(); 
       ImageReadParam param = reader.getDefaultReadParam(); 
       reader.setInput(stream, true, true); 
       Iterator<ImageTypeSpecifier> imageTypes = reader.getImageTypes(0); 
       while (imageTypes.hasNext()) { 
        ImageTypeSpecifier imageTypeSpecifier = imageTypes.next(); 
        int bufferedImageType = imageTypeSpecifier.getBufferedImageType(); 
        if (bufferedImageType == BufferedImage.TYPE_BYTE_GRAY) { 
         param.setDestinationType(imageTypeSpecifier); 
         break; 
        } 
       } 
       bufferedImage = reader.read(0, param); 
       if (null != bufferedImage) break; 
      } catch (Exception e) { 
       lastException = e; 
      } finally { 
       if (null != reader) reader.dispose();    
      } 
     } 
     // If you don't have an image at the end of all readers 
     if (null == bufferedImage) { 
      if (null != lastException) { 
       throw lastException; 
      } 
     } 
+1

Vẻ đẹp của SO: Một vấn đề mà có thể đã đưa tôi hai giờ để tìm ra bây giờ mất 10 phút. Cảm ơn, Tate Moore. – charleslparker

+0

Những thứ tuyệt vời! Không bao giờ nghĩ rằng bất cứ ai sẽ trở lại và gõ này xuống nhưng bạn đã làm! Công cụ đáng yêu. – mtrc

+0

khi tôi sử dụng giải pháp này sau khi nó không thành công với ImageIO.read (InputStream) nó không thực hiện phần còn lại của mã (while (iter.hasNext()) là false), nhưng nếu tôi bỏ qua phần ImageIO.read (InputStream) Làm công việc. Có gì sai với mã của tôi? – user1052958

4

Thông báo lỗi là thông tin và cho biết số lượng dải raster, như đã đề cập trong hồ sơ màu ICC, có vẻ không chính xác. Tôi đã sử dụng ImageMagick để loại bỏ hồ sơ ICC khỏi hình ảnh. ImageIO sau đó không có vấn đề gì khi đọc hình ảnh (~ 1k hình ảnh xấu). Hy vọng rằng sẽ giúp.

+0

Nó đã làm! Cảm ơn. Tôi chắc chắn nghĩ rằng thông điệp là thông tin, nó chỉ ở trên mức độ hiểu biết của tôi, không phải lỗi của họ. Cảm ơn bạn đã bình luận :) – mtrc

1

Có thể đọc hình ảnh này bằng cách sử dụng 12monkeys ImageIO, một thay thế mạnh mẽ và tha thứ hơn cho ImageIO ban đầu do JRE cung cấp.

Xem https://github.com/haraldk/TwelveMonkeys/

tôi tìm thấy giải pháp này trong PDF Box Jira https://issues.apache.org/jira/browse/PDFBOX-3637

Để sử dụng twelvemonkeys, nó là đủ để thêm nó như là một sự phụ thuộc maven. Sau đó nó tự đăng ký trước bộ xử lý hình ảnh mặc định.

<dependency> 
    <groupId>com.twelvemonkeys.imageio</groupId> 
    <artifactId>imageio-jpeg</artifactId> 
    <version>3.3.2</version> <!-- Alternatively, build your own version --> 
</dependency> 
Các vấn đề liên quan