2011-08-24 15 views
21

İlk defa Java ile görüntülerle çalışma ve çok iyi belgelenmeyen bazı garip istisnalar alıyorum. Bu çizgi istisna mesajı olarak Desteklenmeyen resim türü ile IIOException atıyorJava ImageIO IIOException: Desteklenmeyen resim türü?

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

: Burada başarısız kod satırı var. Dosya satırının geçerli olduğunu, URL'nin geçerli olduğunu ve image.jpg aslında aslında diğer görüntü görüntüleyicilerinde mükemmel bir para cezası veren geçerli bir JPG olduğunu, bu satırı istisna attığını kontrol ettim ve yeniden kontrol ettim.

Bu özel durumun niteliği hakkında daha fazla bilgi edinmek için ne yapabilirim? Bu, Java 7'de görüntüleri yüklemek için geleneksel bir yol mu, yoksa bu eski/kullanım dışı bir yöntem mi? Bu "Desteklenmeyen resim türü" istisnaları hakkında çok fazla bilgi yok ve mutlaka ImageIO destekli JPG'ler var!

Yardımlarınız için teşekkürler!

cevap

27

JPEG'in kodlamasını kontrol etmeye çalışın. ImageIO, örneğin CMYK kodlu jpeg resimlerini okuyamaz. AFAIK, ImageIO yıllardır güncellenmediğinden, resmi alternatif/uzantıyı kullanmayı denemek istiyorsunuz: JAI ImageIO.

Unforutnately, JAI ImageIO istenmeyen olabilir JRE içine monte bazı yerel kütüphaneleri, ihtiyacı vardır. Biz aşağıdakileri yapın:

  • kullanım Apache Sanselan o Sanselan okumak ve JPEG yazamıyor, çünkü düz eski AWT JPEGCodec kullanmak
  • JPEG olsun, algılamak için: JPEGCodec.createJPEGDecoder(...)
  • RGB'ye CMYK dönüştürmek biz burada

Aslında inci sonuçlandı benim bir soru daha sonra okuma BufferedImage ait raster almak ve elle dönüştürmek (ICC profilleri kullanabilirsiniz, ancak manuel dönüşüm bizim ihtiyaçlarına uyan) ImageIO, her türlü JPEG görüntüsünü desteklemez ve ben bu iletiyi neden aldığımı gösteren bulgularımın biraz daha fazlasını belirtmiştim: Pure Java alternative to JAI ImageIO for detecting CMYK images

+0

Buradaki yakalama elbette ki JAI ImageIO'nun yerel kitaplıklarının (en azından Windows'ta) yalnızca 32-bit'i desteklemesidir. – Trejkaz

9

Maalesef standart olarak çok sayıda JPEG dosyasını ihlal ettim. ImageIO özellikle seçici ve çoğu zaman yüklenen ve dosya biçimi üzerinde daha az sıkı denetimlerle diğer yazılımlar tarafından doğru şekilde görüntülenen görüntüleri yüklemek için genellikle reddediyor.

Çok güzel değil ama ImageIO sargı olarak daha Spec sapmaları tolere görünüyor gibi bir geçici çözüm, Oracle VM iç JPEG dekoder doğrudan (com.sun.image.codec.jpeg.JPEGCodec) kullanmaktır:

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

Bu belirli VM satıcıya kilitlenmesine sebep olacak ve daha yeni VM sürümleri ile kırılabilir uygulama belirli sınıfları kullanarak beri, elbette değil ideal bir çözümdür, ama sadece kontrollü bir ortamda yazılımı kullandım verirsen, hiç bir çözümden daha iyi olabilir.

+0

Bu harika bir öneri @jarnbjo. Soruma cevap vermek için zaman ayırdığınız için teşekkürler, kesinlikle yolda düşünmek için yiyecek. – IAmYourFaja

+0

Konuyla ilgili istisna neden olan bir cmyk görüntüsü üzerinde denedim ve başarısız oldu (java sürümü "1.8.0_60"): com.sun.image.codec.jpeg.ImageFormatException: Bir JPEG dosyası değil: ile başlar 0xce 0x08 \t sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream (Yerel Yöntem) ~ [?: 1.8.0_60] – yetanothercoder

İlgili konular