web-dev-qa-db-fra.com

Java ImageIO IIOException: Type d'image non pris en charge?

Travailler avec des images en Java pour la première fois et obtenir quelques exceptions bizarro qui ne sont pas très bien documentées. Voici la ligne de code qui échoue:

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

Cette ligne génère une exception IIOException avec Type d'image non pris en charge comme message d'exception. J'ai vérifié et revérifié que c'est bien cette ligne qui lève l'exception, que l'objet File est valide, que l'URL est valide et que image.jpg est en fait un fichier JPG valide qui se charge parfaitement dans d'autres visualiseurs d'images.

Que pourrais-je faire pour obtenir plus d'informations sur la nature de cette exception? Est-ce la méthode traditionnelle de chargement des images dans Java 7 ou s'agit-il d'une méthode ancienne/obsolète? Il n’ya tout simplement pas beaucoup d’informations sur ces exceptions "Type d’image non prise en charge", et sûrement sur les JPG pris en charge par ImageIO!

Merci pour toute aide!

26
IAmYourFaja

Essayez de vérifier l'encodage du JPEG. ImageIO ne peut pas lire les images au format jpeg codées CMJN, par exemple ..__, autant que je sache, ImageIO n'étant pas mis à jour depuis des années, vous souhaitez donc essayer d'utiliser l'alternative officielle/extension: JAI ImageIO .

JAI ImageIO a besoin de quelques bibliothèques natives installées dans JRE, ce qui pourrait être indésirable . Nous procédons comme suit: 

  • utilisez Apache Sanselan pour détecter s'il s'agit d'un fichier JPEG
  • puisque Sanselan ne sait ni lire ni écrire les fichiers JPEG, utilisez l'ancien AWT. JPEGCodec: JPEGCodec.createJPEGDecoder(...)
  • pour convertir CMJN en RVB, nous obtenons ensuite le raster de la variable BufferedImage en lecture et nous le convertissons manuellement (vous pouvez utiliser des profils ICC, mais la conversion manuelle répond à nos besoins).

Voici une de mes questions qui découle du fait que ImageIO ne prend pas en charge tous les types d’images JPEG et j’y ai exposé un peu plus de mes conclusions sur les raisons pour lesquelles vous obtenez ce message: Alternative Java pure à JAI ImageIO pour la détection de CMYK images

32
Thomas

J'ai malheureusement rencontré beaucoup de fichiers JPEG standard violés. ImageIO est particulièrement pointilleux et refuse souvent de charger des images, qui sont souvent chargées et apparemment affichées correctement par un autre logiciel avec des vérifications moins strictes du format de fichier.

Ce n’est pas très joli, mais une solution consiste à utiliser directement le décodeur JPEG interne d’Oracle VM (com.Sun.image.codec.jpeg.JPEGCodec), car il semble tolérer davantage d’écarts de spécifications comme le wrapper ImageIO:

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

Ceci n’est bien sûr pas une solution idéale, car l’utilisation de classes spécifiques à une implémentation vous verrouillera à un fournisseur spécifique VM et risque de rompre avec les versions les plus récentes VM, mais si vous n’utilisez le logiciel que de manière contrôlée. l’environnement, c’est peut-être mieux que pas de solution du tout.

11
jarnbjo

Une autre option consiste à utiliser le fichier .jar préparé par Werner Randelshofer: 

http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-Java-imageio/ ou de la médiathèque de Monte: http://www.randelshofer.ch/monte/

Il semble assez facile et similaire à l’utilisation d’ImageIO et est disponible sous licence CC.

1
Ravbaker