2012-05-02 13 views
16

Przepraszam za nieco niejasny tytuł, nie wiem, jakie są tutaj słowa kluczowe. Układ jest dość prosty, ja otwarcie obrazu zImageIO.read nielegalny argument wyjątek - paski rastrowe/komponenty przestrzeni kolorów?

ImageIO.read(new File(filename)); 

Działa to dla większości plików, jednak dla jednego dostaję IllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match". Ten obraz został uzyskany za pomocą wget na poprawnym adresie URL Flickr, a ja użyłem innych obrazów uzyskanych w ten sposób, więc metoda uzyskiwania obrazów wydaje się zasadniczo brzmieć. Nie jestem pewien, co powoduje wyjątek.

Obejście problemu byłoby więcej niż do zaakceptowania - w szczególności nie używam opcji ImageIO, a obraz wygląda dobrze wizualnie. Po prostu muszę go odczytać bez przerażającej Javy!

Oto obraz, o którym mowa, w przypadku jest jakiegokolwiek użycia:

enter image description here

+0

Otrzymuję ten sam błąd (przynajmniej przy użyciu 'ImageIO.read (nowy adres URL (" http://i.imgur.com/rC6Jk.jpg "));'). Czy to jedyny obraz czarno-biały, który przetwarzasz? –

+0

Trudno powiedzieć - natura procesu pobierania obrazu jest bardzo nieukierunkowana (chodzi o to, że oprogramowanie jest autonomiczne!). Jest to jednak jedyne z tak niskim nasyceniem. Myślisz, że to jest przyczyna? – mtrc

+0

Czy znalazłeś jakieś rozwiązanie? –

Odpowiedz

11

Więc ja miałem ten sam problem i okazało się, że obraz był w skali szarości, a domyślna implementacja ImageIO.read nie domyśliłem się tego, ponieważ metadane obrazu nie były zgodne z oczekiwaniami. Napisałem pracę, która ponawia obciążenie jako "BufferedImage.TYPE_BYTE_GRAY", jeśli zawiedzie główne obciążenie.

  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

Piękno SO: Problem, który zajęłby mi dwie godziny, teraz zajmuje 10 minut. Dziękuję, Tate Moore. – charleslparker

+0

Cudowne rzeczy! Nigdy nie sądziłem, że ktoś wróci i powali to, ale ty to zrobiłeś! Cudowne rzeczy. – mtrc

+0

kiedy używam tego rozwiązania po tym, jak zawiedzie z ImageIO.read (InputStream) nie wykonuje on reszty kodu (podczas gdy (iter.hasNext()) jest fałszywe), ale jeśli pominę część ImageIO.read (InputStream) to wykonuje pracę. Co jest nie tak z moim kodem? – user1052958

4

Komunikat o błędzie ma charakter informacyjny i wskazuje, że liczba zespołów rastrowych, jak wspomniano w profilu kolorów ICC, wydaje się być nieprawidłowy. Użyłem ImageMagick, aby usunąć profil ICC z obrazu. ImageIO później nie ma problemów z odczytaniem obrazów (~ 1k złych obrazów). Nadzieja, która pomaga.

+0

To prawda! Dzięki. Zdecydowanie uważam, że przesłanie ma charakter informacyjny, jest po prostu wyższy niż mój poziom zrozumienia, a nie ich wina. Dzięki za komentowanie :) – mtrc

1

Możliwe jest odczytanie tego obrazu za pomocą Twelvemonkeys ImageIO, który jest bardziej odpornym i wybaczającym zamiennikiem oryginalnego ImageIO dostarczanego przez środowisko JRE.

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

Znalazłem rozwiązanie w polu PDF Jira https://issues.apache.org/jira/browse/PDFBOX-3637

Aby korzystać twelvemonkeys, wystarczy dodać go jako zależność maven. Następnie rejestruje się przed domyślnym procesorem obrazu.

<dependency> 
    <groupId>com.twelvemonkeys.imageio</groupId> 
    <artifactId>imageio-jpeg</artifactId> 
    <version>3.3.2</version> <!-- Alternatively, build your own version --> 
</dependency> 
Powiązane problemy