commande shell pour obtenir la taille en pixels d'une image

44

Existe-t-il une commande shell qui renvoie la taille en pixels d'une image?

J'essaie de produire un gif animé à partir de différents gifs de différentes tailles en utilisant convert(par exemple convert -delay 50 1.gif 2.gif -loop 0 animated.gif).

Le problème est que convert superpose simplement les images en utilisant la taille de la première image comme taille du gif animé, et comme elles ont des tailles différentes, le résultat est un peu un fouillis, avec des fragments d'anciens cadres affichés sous les nouveaux.

bleu
la source
Qu'est-ce que la "taille en pixels"? Bits par pixel (profondeur) ou nombre de pixels?
Ciro Santilli a été inscrit le

Réponses:

50

trouvé une solution identify:, une partie du paquet imagemagick, fait exactement ce dont j'ai besoin

$ identify color.jpg 
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000
bleu
la source
Pouvez-vous expliquer pourquoi j'ai plusieurs lignes lorsque je cours identify imagename.ico? Like todour.ico[0] ICO 32x32 32x32+0+0 4-bit sRGB 0.000u 0:00.000 todour.ico[1] ICO 16x16 16x16+0+0 4-bit sRGB 0.000u 0:00.000 todour.ico[2] ICO 48x48 48x48+0+0 8-bit sRGB 0.000u 0:00.000
Roachsinai
45

Plutôt que d'analyser la sortie de identifyeye ou d'utilitaires de texte, vous pouvez utiliser son -formatoption pour afficher la largeur et la hauteur dans le format qui vous convient le mieux. Par exemple:

$ identify -format '%w %h' img.png
100 200
$ identify -format '%wx%h' img.png
100x200

Vous trouverez une liste des propriétés d'image que vous pouvez générer sur cette page , mais pour la question ici, il semble que tout ce dont vous avez besoin est %wet %h, qui donne la largeur et la hauteur de l'image, respectivement, en pixels.


La flexibilité offerte par -formatm'a été utile pour trouver les images les plus grandes en termes de pixels, en produisant %[fx:w*h]pour un certain nombre d'images et en triant la sortie.

Vous voudrez peut-être spécifier l' -pingoption si vous traitez beaucoup d'images, utilisez des évasions plus complexes et vous voulez vous assurer que le programme ne perd pas de temps à charger toutes les images. Avec des échappées simples, -pingdevrait être la valeur par défaut. Plus d'informations sur le choix entre -pinget +pingpeuvent être trouvées ici .

Dan Getz
la source
15

vous pouvez simplement utiliser la commande "fichier" pour obtenir les informations dont vous avez besoin:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
Pascal Schmiel
la source
1
Cela ne rapporte PAS la taille des autres types d'image (non-png) ... file taylor-swift-money-makers-990.jpg->taylor-swift-money-makers-990.jpg: JPEG image data, JFIF standard 1.01, comment: "CREATOR: gd-jpeg v1.0 (using IJ"
alex grey
Ce n'est pas vrai, c'est le cas dans les versions récentes de MacOS.
rien333
5

Utilisez identifypour voir les tailles:

$ identify color.jpg 
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000

Extraire la valeur via cut | sed, à partir du champ 3:

identify ./color.jpg | cut -f 3 -d " " | sed s/x.*// #width
identify ./color.jpg | cut -f 3 -d " " | sed s/.*x// #height

Asign à variable:

W=`identify ./color.jpg | cut -f 3 -d " " | sed s/x.*//` #width
H=`identify ./color.jpg | cut -f 3 -d " " | sed s/.*x//` #height
echo $W
> 1980
echo $H
> 650
Hugolpz
la source
2

Les deux displayet filesont assez lents, et ont le potentiel d'apporter encore tout à fait des systèmes capables à leurs genoux traitant de nombreux fichiers multiples. Un petit test:

     $ du -h *.png --total | tail -n 1
     9.2M    total

     $ ls -l *.png | wc -l
     107

     $ /usr/bin/time file *.png
-->  0.37user 0.26system 0:06.93elapsed 9%CPU (0avgtext+0avgdata 37232maxresident)k
     22624inputs+0outputs (9major+2883minor)pagefaults 0swaps

     $ /usr/bin/time identify *.png
-->  0.56user 0.22system 0:06.77elapsed 11%CPU (0avgtext+0avgdata 25648maxresident)k
     34256inputs+0outputs (119major+2115minor)pagefaults 0swaps

En ne lisant que les octets nécessaires, cette opération peut être considérablement accélérée.

     $ /usr/bin/time ./pngsize *.png
-->  0.00user 0.00system 0:00.03elapsed 12%CPU (0avgtext+0avgdata 1904maxresident)k
     0inputs+0outputs (0major+160minor)pagefaults 0swaps

Voici pngsize:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <err.h>
#define oops(syscall) { printf("error processing %s: ", argv[i]); \
        fflush(0); perror(syscall"()"); continue; }
int main(int argc, char **argv) {
    int fd, i;
    uint32_t h, w;
    if (argc < 2) { printf("%s <pngfile> [pngfile ...]\n", argv[0]); exit(0); }
    for (i = 1; i < argc; i++) {
        if (argc > 2) printf("%s: ", argv[i]);
        if ((fd = open(argv[i], O_RDONLY)) == -1) oops("open");
        if (lseek(fd, 16, SEEK_SET) == -1) oops("lseek");
        if (read(fd, &w, 4) < 1) oops("read");
        if (read(fd, &h, 4) < 1) oops("read");
        printf("%dx%d\n", htonl(w), htonl(h));
        if (close(fd) == -1) oops("close");
    }
    return 0;
}

Cette méthode est beaucoup plus rapide que d’utiliser une bibliothèque qui charge le PNG en avant, en arrière et de côté pour obtenir la taille de l’image: P (Considérez le code avec soin avant de l’alimenter dans un répertoire plein de PNG arbitraires, bien sûr.)

Les utilisations de code inet.h pour htonl () pour dé- endian -ize l'ordre des octets d' en- tête.

i336_
la source
0

Vous pouvez également essayer GraphicsMagick , un fichier bien entretenu d’ImageMagick, utilisé par exemple sur Flickr et Etsy:

$ gm identify a.jpg
a.jpg JPEG 480x309+0+0 DirectClass 8-bit 25.2K 0.000u 0:01

C'est plus rapide que l'identité d'ImageMagick (deux fois dans mes tests).

Jerry Epas
la source
0

C'était un extrait utile (je n'ai pas écrit) qui renvoie les dimensions pour chaque png et jpg du dossier:

file ./* | perl -ne '@m = /^.*.jpg|^.*.png|[0-9][0-9]*[ ]?x[ ]?[0-9][0-9]*/g; print "@m\n"'
ArleyM
la source
0

Pour ceux qui, comme moi, veulent la taille en mégapixels:

perl -le "printf \"=> fileName = %s size = %.2f Mpix\n\", \"$fileName\", $(identify -format '%w*%h/10**6' $fileName)"
SebMa
la source