11
votes

Obtenir la taille de l'image de JPEG de son binaire

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): xxx

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?


0 commentaires

5 Réponses :


11
votes

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.


Néanmoins, citant de FAQ de compression d'image JPEG, partie 1/2 :

Sujet: [22] Comment mon programme peut-il extraire les dimensions de l'image d'un JPEG fichier?

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 (début de Cadre, type n) .
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.)
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/ .

(Ergh, ce lien semble cassé ...)


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


5 commentaires

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/...



6
votes

Cette fonction lira les propriétés JPEG xxx

Â


1 commentaires

La solution courte et parfaite.



0
votes

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: xxx

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)

à partir de la page man:

Pour plus d'informations sur la commande "Identifier", pointez votre navigateur sur [...] http://www.imagemagick.org/script/identicy.php .


0 commentaires

0
votes

J'ai converti le code CPP de la réponse supérieure dans un script Python. xxx


0 commentaires

1
votes

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:

  • Démarrer depuis le premier octet
  • Le début d'un segment sera toujours FF suivi d'un autre type d'octet indiquant le type de marqueur (ces 2 octets sont appelés marqueur)
  • Si cet autre octet est 01 ou d1 via d9 , il n'y a pas de données dans ce segment, alors passez au segment suivant
  • Si ce marqueur est C0 ou C2 (ou tout autre c n , 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) respectivement
    • 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
    • Répétez jusqu'à ce que vous trouviez le marqueur SOFN xxx

0 commentaires