2011-08-24 15 views
21

Lavorare con le immagini in Java per la prima volta e sto ottenendo alcune eccezioni bizarro che non sono documentate molto bene. Ecco la linea di codice che sta fallendo:Java ImageIO IIOException: tipo di immagine non supportato?

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

Questa linea sta gettando un IIOException con non supportato tipo di immagine come il messaggio di eccezione. Ho controllato e ricontrollato che è in effetti questa riga che lancia l'eccezione, che l'oggetto File è valido, che l'URL è valido e che lo image.jpg è in effetti un JPG valido che carica perfettamente bene negli altri visualizzatori di immagini.

Cosa posso fare per ottenere ulteriori informazioni sulla natura di questa eccezione? È questo il modo tradizionale per caricare le immagini in Java 7 o si tratta di un metodo obsoleto/obsoleto? Non ci sono molte informazioni su queste "eccezioni di tipo di immagine non supportate" e, sicuramente, con JPG supportati da ImageIO!

Grazie per qualsiasi aiuto!

risposta

27

Provare a verificare la codifica del file JPEG. ImageIO non può leggere le immagini jpeg codificate CMYK per esempio. AFAIK, ImageIO non è stato aggiornato per anni, quindi ti piacerebbe provare e utilizzare l'alternativa/estensione ufficiale: JAI ImageIO.

Unforutnately, JAI ImageIO ha bisogno di alcune librerie native installate nel JRE, che potrebbero essere indesiderate. Abbiamo effettuare le seguenti operazioni:

  • uso Apache Sanselan per rilevare, che si tratti di un JPEG
  • dal Sanselan non riesce a leggere e scrivere JPEG, utilizzare la pianura vecchio AWT JPEGCodec: JPEGCodec.createJPEGDecoder(...)
  • per convertire CMYK a RGB , abbiamo quindi ottenere il raster della lettura BufferedImage e convertirlo manualmente (è possibile utilizzare i profili ICC, ma la conversione manuale si adatta alle nostre esigenze)

Ecco una mia domanda che ha portato al fatto ° a ImageIO non supporta tutti i tipi di immagini JPEG e ho indicato un po 'più delle mie conclusioni sul motivo per cui viene visualizzato: Pure Java alternative to JAI ImageIO for detecting CMYK images

+0

Il problema qui è che le librerie native di JAI ImageIO (almeno su Windows) supportano solo 32 bit. – Trejkaz

9

Ho sfortunatamente incontrato un sacco di file JPEG che violano lo standard. ImageIO è particolarmente pignolo e spesso rifiuta di caricare immagini, che sono spesso caricate e apparentemente visualizzate correttamente da altri software con controlli meno severi sul formato del file.

Non è molto bello, ma una soluzione è utilizzare il decodificatore interno Oracle VM JPEG direttamente (com.sun.image.codec.jpeg.JPEGCodec), come sembra tollerare più deviazioni spec come involucro ImageIO:

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

Questo è, naturalmente, non è una soluzione ideale, dal momento che utilizzando le classi specifiche di implementazione si blocca a uno specifico fornitore VM e può rompere con le versioni più recenti di macchine virtuali, ma se si è utilizzato solo il software in un ambiente controllato, potrebbe essere meglio di nessuna soluzione.

+0

Questo è un ottimo suggerimento @jarnbjo. Grazie per aver dedicato del tempo a rispondere alla mia domanda, sicuramente spunti di riflessione lungo la strada. – IAmYourFaja

+0

L'ho provato su un'immagine cmyk con l'eccezione come nell'argomento e non è riuscito (versione java "1.8.0_60"): com.sun.image.codec.jpeg.ImageFormatException: non è un file JPEG: inizia con 0xce 0x08 \t su sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream (metodo nativo) ~ [?: 1.8.0_60] – yetanothercoder

Problemi correlati