Shell-Befehl zum Abrufen der Pixelgröße eines Bildes

43

Gibt es einen Shell-Befehl, der die Pixelgröße eines Bildes zurückgibt?

Ich versuche mit convert(zB convert -delay 50 1.gif 2.gif -loop 0 animated.gif) ein animiertes Gif aus verschiedenen Gifs mit verschiedenen Größen zu erstellen .

Das Problem ist, dass beim Konvertieren einfach die Bilder mit der Größe des ersten Bilds als Größe des animierten Gifs überlappt werden. Da sie unterschiedliche Größen haben, ist das Ergebnis ein bisschen chaotisch, und die alten Frames werden unter den neuen Frames angezeigt.

Blau
quelle
Was ist "Pixelgröße"? Bits pro Pixel (Tiefe) oder Pixelanzahl?
Ciro Santilli

Antworten:

50

habe eine lösung gefunden identify:, teil des imagemagick pakets, macht genau das was ich brauche

$ identify color.jpg 
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000
Blau
quelle
Können Sie erklären, warum ich beim Ausführen mehrere Zeilen habe 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
44

Anstatt die Ausgabe identifynach Augenmaß oder nach Textdienstprogrammen zu analysieren , können Sie die -formatOption verwenden, um die Breite und Höhe in dem für Sie am besten geeigneten Format auszugeben. Zum Beispiel:

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

Eine Liste der Bildeigenschaften, die Sie ausgeben können, finden Sie auf dieser Seite . Für die Frage hier scheinen Sie jedoch nur %wund zu benötigen %h, die die Breite und Höhe des Bildes in Pixel angeben.


Die von gebotene Flexibilität erwies sich -formatfür mich als nützlich, um die größten Bilder in Bezug auf Pixel zu finden, indem %[fx:w*h]für eine Reihe von Bildern ausgegeben und die Ausgabe sortiert wurde.

Möglicherweise möchten Sie die -pingOption angeben, wenn Sie viele Bilder verarbeiten, kompliziertere Escape-Zeichen verwenden und sicherstellen möchten, dass das Programm keine Zeit mit dem Laden der gesamten Bilder verschwendet. Bei einfachen Escape-Anweisungen -pingsollte dies die Standardeinstellung sein. Weitere Informationen zur Auswahl zwischen -pingund +pingfinden Sie hier .

Dan Getz
quelle
15

Sie können einfach den Befehl "file" verwenden, um die benötigten Informationen zu erhalten:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
Pascal Schmiel
quelle
1
Dies gibt NICHT die Größe für andere (nicht-png) Bildtypen an ... 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
Nicht wahr, zumindest unter den neuesten MacOS-Versionen.
Rien333
5

Verwenden Sie identify, um die Größen zu sehen:

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

Wert extrahieren über cut | sed, aus Feld 3:

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

Zu Variable zuordnen:

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
quelle
2

Beide displayund filesind ziemlich langsam, und haben das Potenzial , zu bringen , auch durchaus in der Lage Systeme in die Knie mit vielen mehrere Dateien handelt. Ein kleiner 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

Durch Lesen nur der erforderlichen Bytes kann dieser Vorgang erheblich beschleunigt werden.

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

Hier ist 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;
}

Diese Methode ist viel schneller als die Verwendung einer Bibliothek, die das PNG vorwärts, rückwärts und seitwärts lädt, um die Bildgröße zu erhalten: P (Lesen Sie den Code sorgfältig durch, bevor Sie ihn in ein Verzeichnis mit beliebigen PNGs einfügen.)

Der Code verwendet inet.h für htonl () zu de- Endian -ize Header Byte - Reihenfolge.

i336_
quelle
0

Sie können auch GraphicsMagick ausprobieren , eine gut gepflegte Version von ImageMagick, die beispielsweise bei Flickr und Etsy verwendet wird:

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

Es ist schneller als ImageMagick zu identifizieren (in meinen Tests etwa zweimal).

Jerry Epas
quelle
0

Dies war ein hilfreiches Snippet (ich habe es nicht geschrieben), das Dimensionen für jedes PNG und JPG im Ordner zurückgibt:

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

Für diejenigen wie mich, die die Größe in Megapixeln wollen:

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