polecenie powłoki, aby uzyskać rozmiar piksela obrazu

43

Czy istnieje polecenie powłoki, które zwraca rozmiar piksela obrazu?

Próbuję stworzyć animowany gif, zaczynając od różnych gifów o różnych rozmiarach, używając convert(np convert -delay 50 1.gif 2.gif -loop 0 animated.gif.).

Problem polega na tym, że konwersja po prostu nakłada się na obrazy przy użyciu rozmiaru pierwszego obrazu jako rozmiaru animowanego gifa, a ponieważ mają one różne rozmiary, wynik jest nieco bałaganu, a fragmenty starych ramek są wyświetlane pod nowymi.

niebieski
źródło
Co to jest „rozmiar piksela”? Bity na piksel (głębokość) czy liczba pikseli?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

50

znalazłem rozwiązanie: identifyczęść pakietu imagemagick robi dokładnie to, czego potrzebuję

$ identify color.jpg 
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000
niebieski
źródło
Czy możesz wyjaśnić, dlaczego mam wiele wierszy podczas biegu 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

Zamiast analizować dane wyjściowe za identifypomocą oka lub za pomocą narzędzi tekstowych, możesz użyć tej -formatopcji do wyświetlania szerokości i wysokości w dowolnym formacie, który najbardziej Ci odpowiada. Na przykład:

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

Lista właściwości obrazu, które można wydrukować, znajduje się na tej stronie , ale w przypadku tego pytania wydaje się, że wszystko, czego potrzebujesz, %wi %hktóre podają odpowiednio szerokość i wysokość obrazu, w pikselach.


Elastyczność, jaką zapewniała, -formatprzydała mi się w wyszukiwaniu największych obrazów pod względem pikseli, %[fx:w*h]generowaniu wielu zdjęć i sortowaniu wyników.

Możesz określić tę -pingopcję, jeśli przetwarzasz wiele obrazów, używając bardziej skomplikowanych znaków ucieczki i chcesz mieć pewność, że program nie marnuje czasu na ładowanie całych obrazów. Przy prostych ucieczkach -pingpowinien być domyślny. Więcej informacji na temat wyboru pomiędzy -pingi +pingmożna znaleźć tutaj .

Dan Getz
źródło
15

możesz po prostu użyć polecenia „plik”, aby uzyskać potrzebne informacje:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
Pascal Schmiel
źródło
1
To NIE zgłasza rozmiaru dla innych typów obrazów (nie 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
Nieprawda, przynajmniej w najnowszych wersjach macOS.
rien333
5

Użyj, identifyaby zobaczyć rozmiary:

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

Wyodrębnij wartość przez cut | sed, z pola 3:

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

Przypisz do zmiennej:

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
źródło
2

Zarówno displayi filesą dość powolne i mają potencjał, aby przynieść nawet systemów całkowicie zdolny do ich kolan do czynienia z wieloma wieloma plikami. Mały 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

Czytanie tylko niezbędnych bajtów pozwala znacznie przyspieszyć tę operację.

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

Oto 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;
}

Ta metoda jest znacznie szybsza niż użycie biblioteki, która ładuje PNG do przodu, do tyłu i na boki, aby uzyskać rozmiar obrazu: P (Rozważ uważnie kod przed załadowaniem go do katalogu pełnego arbitralnych PNG).

Zastosowania kod inet.h dla htonl () do de- endian -ize zamawiania nagłówek bajtów.

i336_
źródło
0

Możesz także wypróbować GraphicsMagick , który jest dobrze utrzymanym widelcem ImageMagick używanym np. W Flickr i Etsy:

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

Jest szybszy niż identyfikacja ImageMagick (w moich testach około dwa razy).

Jerry Epas
źródło
0

To był pomocny fragment (nie napisałem), który zwraca wymiary dla każdego png i jpg w folderze:

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

Dla takich jak ja, którzy chcą wielkości w megapikselach:

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