Convertisseur Java JPEG pour les types d'images Impairs


J'ai un programme qui redimensionne les images en utilisant la bibliothèque d'images mortennobel pour le filtre/algorithme de redimensionnement. J'utilise la bibliothèque standard Java ImageIO pour lire le fichier dans un objet BufferedImage. Cependant, le problème que j'ai est que la bibliothèque ImageIO n'accepte que les formes standard d'images et donc si la fonction ImageIO.read() lance un IOException je veux l'attraper et convertir l'image en une forme standard telle qu'un JPEG.

Juste pour clarifier, le problème que j'ai est que certaines des images ne sont pas d'un format JPEG standard, c'est-à-dire FF D8 FF E0 JFIF, mais ils ont été produits par un appareil photo numérique ou édités dans photoshop et le format est FF D8 FF E1 Exif. Il est possible de changer ce format en chargeant l'image dans un programme comme paint et en l'enregistrant à nouveau au format JPEG, mais ce n'est pas idéal pour ma situation car j'aimerais qu'elle soit automatisée.

Convertir: FF D8 FF E1 Exif à FF D8 FF E0 JFIF

Author: trooper, 2011-10-06

1 answers

Le premier champ après le marqueur FFE0 est le champ de longueur. Il fait 16 bits de long big endian et comprend la longueur du champ length mais pas le marqueur FFE0. Copiez simplement le marqueur FFE0 et les données associées à partir d'un jpeg existant et placez-le entre FFD8 et FFE1.

Selon la norme JFIF, l'en-tête JFIF doit suivre immédiatement après SOI (FFD8). Chaque jpeg sans en-tête JFIF est essentiellement cassé car il n'y a aucun moyen de savoir quel code couleur est utilisé. Bien sûr il y a les Adobe jpeg mais ils ne comptent pas vraiment. S'il y a un en-tête JFIF, vous savez que l'image est codée dans YCbCr. S'il n'y a pas d'en-tête JFIF, vous pouvez peut-être supposer que c'est YCbCr, mais vous ne pouvez pas le savoir avec certitude.

Vous pouvez en savoir plus sur la norme JFIF ici: http://www.w3.org/Graphics/JPEG/jfif3.pdf

 3
Author: onemasse, 2011-10-11 17:02:15