J'essaie de trouver une méthode très rapide pour déterminer les dimensions d'une image.
Je sais que je pourrais mouiller l'image, puis utiliser imagemagick pour déterminer la hauteur et la largeur de l'image. Je crains que ce ne soit pas le moyen le plus rapide de le faire.
Je souhaite également installer imagemagick lorsque je n'ai besoin que d'un très petit sous-ensemble de fonctionnalités. Je suis sur un système embarqué aux ressources très limitées (CPU, RAM, stockage).
Des idées?
bash
wget
imagemagick
exvance
la source
la source
Réponses:
Comme vous le constatez, vous n'avez pas besoin de l'ensemble du package ImageMagick . Vous avez juste besoin
identify
.Vous aurez également besoin des bibliothèques auxquelles les liens exécutables (et des bibliothèques vers lesquelles ces bibliothèques sont liées).
ldd
affichera une liste. Quand j'ai fait cela, il comprenait quelques librairies X, libjpeg, etc. et deux bibliothèques clairement du paquet ImageMagick,libMagickCore
etlibMagickWand
. Ceux-ci semblent être liés au même groupe de choses, donc si vous en avez, celaidentify
devrait fonctionner.Vous n'avez pas besoin de télécharger une image entière pour obtenir les dimensions, car celles-ci sont dans un en-tête au début du fichier et c'est ce qui
identify
se passe. Par exemple, ici, je copie les 4 premiers Ko d'un fichier jpeg complet dans un nouveau fichier:4 Ko devraient être plus que suffisants pour inclure l'en-tête - je suis sûr que vous pourriez le faire avec 1/4 de cette quantité. Maintenant:
Ce sont les bonnes dimensions pour
real.jpg
. Notez cependant que la taille (4,1 Ko) est la taille du fichier tronqué, car ces informations ne proviennent pas de l'en-tête de l'image.Donc: vous n'avez qu'à télécharger le premier kilo-octet environ de chaque image.
la source
Vous pouvez utiliser
curl
pour télécharger des parties de l'image. Tout dépend de sa robustesse. Un cas de test pourrait être de 500 premiers octets. Semble travail pour beaucoup depng
etjpg
, puis utilisezidentify
ou similaire pour vérifier la taille.Éditer:
Il y a longtemps que j'ai écrit des analyseurs d'images, mais j'ai réfléchi et rafraîchi une partie de ma mémoire.
Je soupçonne que ce sont toutes sortes d'images que vous souhaitez vérifier (mais encore une fois, peut-être pas). Je vais vous décrire quelques - unes des plus courantes:
PNG
,JPEG
(JFIF) etGIF
.PNG:
Celles-ci sont simples en matière d'extraction de taille. Un en-
png
tête stocke la taille dans les 24 premiers octets. Vient d'abord un en-tête fixe:Viennent ensuite des morceaux à travers le fichier. Ils se composent d'un champ fixe de longueur, de type et de somme de contrôle. En outre, une section de données facultative de taille de longueur .
Heureusement, le premier morceau est toujours un
IHDR
avec cette disposition:Par cela, nous avons que les tailles sont octets 16-20 et 21-24. Vous pouvez vider les données par exemple hexdump:
Sur une machine Big Endian / Motorola, on pourrait également imprimer les tailles directement en:
Cependant, sur Little Endian / Intel, ce n'est pas si simple, et ce n'est pas très portable.
Par cela, nous pourrions implémenter un script bash + hexdump comme dans:
Mais ce n'est pas directement efficace. Bien qu'il nécessite un plus gros morceau (75-100 octets), il
identify
est plutôt plus rapide. Ou écrivez la routine par exemple en C, ce qui serait plus rapide que les appels de bibliothèque.JPEG:
En ce qui concerne
jpg
ce n'est pas si simple. Il commence également par un en- tête de signature , mais le bloc de taille n'est pas à un décalage fixe. Après l'en-tête:un nouveau bloc vient spécifié par un marqueur de deux octets commençant par
0xff
. Celui qui contient des informations sur les dimensions a la valeur0xffc0
mais peut être enterré un peu dans les données.En d'autres termes, on saute les octets de taille de bloc , vérifie le marqueur, saute les octets de taille de bloc , lit le marqueur, et ainsi de suite jusqu'à ce que le bon arrive.
Lorsqu'elles sont trouvées, les tailles sont stockées sur deux octets chacune aux décalages 3 et 5 après le marqueur .
A écrit un programme C simple pour vérifier certains fichiers et environ 10 000 images jpg, environ 50% avaient les informations de taille dans les 500 premiers octets, principalement 50% entre env. 100 et 200. Le pire était d'environ 80 000 octets. Une image, comme on parle d'images:
GIF:
Bien que gif puisse généralement avoir plusieurs images stockées, il a une taille de toile spécifiée dans l'en-tête, c'est assez grand pour héberger les images. C'est aussi simple qu'avec PNG , et nécessite même des octets de fièvre: 10. Après la magie et la version, nous trouvons des tailles. Exemple à partir d'une image 364x472:
En d'autres termes, vous pouvez vérifier les six premiers octets pour voir s'il s'agit d'un gif, puis lire les quatre suivants pour les tailles.
Autres formats:
Aurait pu continuer, mais je suppose que je m'arrête ici pour l'instant.
la source
Suppose que vous avez "identifier". Mettez cela dans un script et
chmod +x <scriptname>
. Pour l'exécuter, tapez<scriptname> picture.jpg
et vous obtiendrez la hauteur et la largeur de l'image. Les 2 premières sections consistent à vérifier s'il y a une image puis à la définir comme variable IMAGE. La section suivante consiste à s'assurer que le fichier est bien là. Les 2 dernières sections doivent extraire les informations pertinentes de la sortie «identifier» et les afficher.la source
file command
est installé par défaut sur les distors et ne dépend que de:Je pense que vous pouvez l'installer facilement pour embarqué. Vous écrivez juste un
regular expression
pour sa sortie.la source
file
ne donne pas de dimensions pour, par exemple, les.jpg
fichiers.Vous remplacez
file://
parhttp://
la source