Java ImageIO IIOException: unsupported image type?

travailler avec des images en Java pour la première fois et je reçois 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 lance une IIOException avec type d'image non supporté comme message d'exception. J'ai vérifié et re-vérifié qu'il est en fait cette ligne de lancer l'exception, que l'objet de Fichier est valide, que l'URL est valide, et que la image.jpg est en fait un JPG valide qui se charge parfaitement bien dans les autres visionneuses d'images.

Que puis-je faire pour obtenir plus d'information sur la nature de cette exception? Est-ce la façon traditionnelle de charger des images en Java 7, ou est-ce une méthode ancienne/dévalorisante? Il n'y a tout simplement pas beaucoup d'informations sur ces exceptions de "type d'image non supporté", et sûrement, ImageIO soutenu JPGs!

Merci pour votre aide!

26
demandé sur IAmYourFaja 2011-08-24 18:58:56

3 réponses

essayez de vérifier l'encodage du JPEG. ImageIO ne peut pas lire les images jpeg codées en CMYK par exemple. AFAIK, ImageIO n'a pas été mis à jour depuis des années, donc vous souhaitez essayer d'utiliser l'alternative/extension officielle: JAI ImageIO .

malheureusement, JAI ImageIO a besoin de bibliothèques natives installées dans la JRE, qui pourraient être indésirables. Nous faisons ce qui suit:

  • utiliser Apache Sanselan pour détecter, si c'est un JPEG
  • depuis Sanselan ne peut pas lire et écrire JPEG, utilisez le vieux AWT simple JPEGCodec : JPEGCodec.createJPEGDecoder(...)
  • pour convertir CMYK en RVB, nous obtenons alors la trame de la lecture BufferedImage et le convertir manuellement (vous pourriez utiliser des profils ICC, mais la conversion manuelle correspond à nos besoins)

Voici une question à moi qui résulte du fait que ImageIO ne supporte pas tous les types alternative Java Pure à JAI ImageIO pour la détection D'images CMJN 151980920"

30
répondu Thomas 2017-05-23 12:02:00

j'ai malheureusement rencontré beaucoup de violations standard des fichiers JPEG. ImageIO est particulièrement difficile et refuse souvent de charger des images, qui sont souvent chargées et apparemment affichées correctement par d'autres logiciels avec des contrôles moins stricts sur le format de fichier.

ce n'est pas très joli, mais une solution consiste à utiliser le décodeur interne JPEG Oracle VM directement (com.soleil.image.codec.jpeg.JPEGCodec), car il semble tolérer plus de déviations spec:

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

ce n'est bien sûr pas une solution idéale, car l'utilisation de classes spécifiques à l'implémentation va vous verrouiller sur un fournisseur de VM spécifique et peut rompre avec les nouvelles versions de VM, mais si vous utilisez le Logiciel uniquement dans un environnement contrôlé, il peut être préférable qu'il n'y ait aucune solution.

10
répondu jarnbjo 2011-08-24 15:08:16

une Autre option est d'utiliser .jar préparé par Werner Randelshofer:

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

il semble assez facile et similaire à L'utilisation D'ImageIO et disponible sous licence CC.

1
répondu Ravbaker 2014-08-27 12:09:52