web-dev-qa-db-de.com

Java ImageIO IIOException: Nicht unterstützter Bildtyp?

Das erste Mal mit Bildern in Java arbeiten, und ich bekomme einige bizarro-Ausnahmen, die nicht sehr gut dokumentiert sind. Hier ist die Codezeile, die fehlschlägt:

BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));

Diese Zeile löst eine IIOException mit nicht unterstützter Bildtyp als Ausnahmemeldung aus. Ich habe überprüft und erneut überprüft, dass diese Zeile tatsächlich die Ausnahme auslöst, dass das Dateiobjekt gültig ist, dass die URL gültig ist und dass image.jpg tatsächlich eine gültige JPG-Datei ist, die in anderen Bildbetrachtern einwandfrei geladen wird.

Was kann ich tun, um weitere Informationen über die Art dieser Ausnahme zu erhalten? Ist dies die traditionelle Art, Bilder in Java 7 zu laden, oder handelt es sich um eine alte/veraltete Methode? Es gibt einfach nicht viele Informationen über diese Ausnahmen "Nicht unterstützter Bildtyp" und sicherlich ImageIO-unterstützte JPGs!

Danke für jede Hilfe!

26
IAmYourFaja

Versuchen Sie, die Kodierung des JPEG zu überprüfen. ImageIO kann keine CMYK-codierten JPEG-Bilder lesen. AFAIK, ImageIO wurde seit Jahren nicht aktualisiert. Sie möchten also die offizielle Alternative/Erweiterung verwenden: JAI ImageIO .

Unbedingt benötigt JAI ImageIO einige native Bibliotheken, die in der JRE installiert sind, was möglicherweise unerwünscht ist .. __ Wir machen Folgendes: 

  • verwenden Sie Apache Sanselan , um festzustellen, ob es sich um ein JPEG handelt
  • da Sanselan kein JPEG-Format lesen und schreiben kann, verwenden Sie den einfachen alten AWT JPEGCodec: JPEGCodec.createJPEGDecoder(...).
  • um CMYK in RGB zu konvertieren, erhalten wir das Raster von read BufferedImage und konvertieren es manuell (Sie können ICC-Profile verwenden, aber die manuelle Konvertierung entspricht unseren Anforderungen).

Hier ist eine Frage von mir, die aus der Tatsache resultiert, dass ImageIO nicht alle Arten von JPEG-Bildern unterstützt, und ich habe dort ein wenig mehr von meinen Befunden angegeben, warum Sie diese Meldung erhalten: Reine Java-Alternative zu JAI ImageIO zur Erkennung von CMYK Bilder

32
Thomas

Ich bin leider auf viele Standards gestoßen, die gegen JPEG-Dateien verstoßen. ImageIO ist besonders wählerisch und weigert sich häufig, Bilder zu laden, die häufig geladen und anscheinend von anderer Software korrekt angezeigt werden, wobei das Dateiformat weniger streng geprüft wird.

Es ist nicht sehr hübsch, aber eine Problemumgehung besteht darin, den internen JPEG-Decoder von Oracle VM direkt zu verwenden (com.Sun.image.codec.jpeg.JPEGCodec), da er offensichtlich mehr Abweichungen als ImageIO-Wrapper toleriert:

BufferedImage img = 
    JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();

Dies ist natürlich keine ideale Lösung, da die Verwendung von implementierungsspezifischen Klassen Sie an einen bestimmten VM - Anbieter bindet und mit neueren VM -Versionen brechen kann. Wenn Sie die Software jedoch nur in einer kontrollierten Version verwenden Umwelt kann es besser sein als überhaupt keine Lösung.

11
jarnbjo

Eine andere Möglichkeit ist die Verwendung von .jar von Werner Randelshofer: 

http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-Java-imageio/ oder Monte Media Library: http://www.randelshofer.ch/monte/

Es sieht ziemlich einfach und ähnlich wie ImageIO aus und ist unter der CC-Lizenz verfügbar.

1
Ravbaker