J'ai beaucoup de fichiers JPEG avec une taille d'image variable. Par exemple, voici les premiers 640 octets, comme indiqué par HexDump d'une image de taille 256 * 384 (pixels): Je suppose que les informations de taille MUS soient dans ces lignes. Mais je suis incapable de voir quels octets donnent correctement les tailles. Quelqu'un peut-il m'aider à trouver les champs contenant les informations de taille? P> p>
5 Réponses :
Selon le Syntaxe et structure section du page JPEG sur Wikipedia , la largeur et la hauteur de l'image ne semblent pas être stockées dans l'image elle-même - ou à moins, pas d'une manière assez facile à trouver. p>
Néanmoins, citant de FAQ de compression d'image JPEG, partie 1/2 2/2 : p>
Sujet: [22] Comment mon programme peut-il extraire les dimensions de l'image d'un JPEG fichier? fort> p> L'en-tête d'un fichier JPEG est composé de une série de blocs, appelés "marqueurs". la hauteur et la largeur de l'image sont stockées dans un marqueur de type SOFN fort> (début de Cadre, type n) em>.
pour trouver le sofn Vous devez sauter le précédent Marqueurs; vous n'avez pas à savoir ce qu'il y a Dans les autres types de marqueurs, juste utilisez leurs mots de longueur pour sauter eux.
La logique minimale nécessaire est peut-être une page de code C.
(certains Les gens ont recommandé juste chercher Pour la paire d'octets représentant Sofn, Sans porter une attention sur le marqueur Structure de blocage. Ceci est dangereux parce qu'un marqueur précédent pourrait contenir le motif de Sofn, soit par hasard ou parce qu'il contient un JPEG-compressé Image vignette. Si vous ne suivez pas la structure de marqueur que vous récupérerez la taille de la vignette au lieu de la taille principale de l'image.) em>
un abondamment Exemple commenté en C peut être trouvé dans rdjpgcom.ca dans la distribution IJG (Voir la partie 2, point 15).
PERL Code peut être trouvé sur wwwis, de http://www.tardis.ed.ac.uk/~ark/wwwis/ . p> blockQuote>(Ergh, ce lien semble cassé ...) em> p>
Voici une partie du code C qui pourrait vous aider, cependant: Décodage de la largeur et de la hauteur d'une JPEG (JFIF ) Fichier P>
Si tel est le cas, comment Nautilus ou un autre visualiseur d'images décide de la résolution de l'image? Que aussi ils semblent être d'accord sur la valeur 256 * 384 pour cette image
Merci beaucoup! J'ai compris maintenant. Greping 0xFFC0 semble fonctionner, de toute façon je comprends le danger impliqué là-bas! Merci encore! BTW, c'est mon premier message à Stackoverflow! Assez étonné de la solidité et de la précision de la réponse. Merci tout le monde!
Les deux derniers liens sont cassés.
Les deux derniers liens sont toujours cassés
Voici les archives pour le dernier lien: web.archive.org/web/20131016210645/http://www.64lines.com/...
Cette fonction lira les propriétés JPEG Â p> p>
La solution courte et parfaite.
Si vous êtes sur un système Linux et que vous avez PHP à portée de main, les variations de ce script PHP peuvent produire ce que vous recherchez: hôte> imageInfo 009140_dji_0007.jpg < /strong > strong >009140_dji_0007.jpg|jpeg|4000x3000| nom de fichier (type de fichier, dimensions de fichier dans le format délimité de tuyau) p > à partir de la page man: p> Pour plus d'informations sur la commande "Identifier", pointez votre navigateur sur [...] http://www.imagemagick.org/script/identicy.php . p> p>
J'ai converti le code CPP de la réponse supérieure dans un script Python.
Voici comment j'ai implémenté cela à l'aide de JS. Le marqueur que vous recherchez est le marqueur SOFN et le pseudocode constitueraient essentiellement:
FF code> suivi d'un autre type d'octet indiquant le type de marqueur (ces 2 octets sont appelés marqueur) li>
- Si cet autre octet est
01 code> ou d1 code> via d9 code>, il n'y a pas de données dans ce segment, alors passez au segment suivant li>
- Si ce marqueur est
C0 code> ou C2 code> (ou tout autre c n em>, plus de détails dans les commentaires du code), c'est la Sofn marqueur que vous recherchez
- Les octets suivants après que le marqueur soit p (1 octet), L (2 octets), hauteur (2 octets), largeur (2 octets) em> respectivement li>
ul>
li>
- Sinon, les deux octets suivants suivis de ce sera la propriété de longueur (longueur du segment entier à l'exclusion du marqueur, 2 octets), utilisez-le pour passer au segment suivant Li>
- Répétez jusqu'à ce que vous trouviez le marqueur SOFN LI>
ul>
xxx pré> p>