команда shell для отримання розміру пікселя зображення


43

Чи є команда оболонки, яка повертає розмір пікселя зображення?

Я намагаюся створити анімований gif, починаючи з різних gif-файлів з різними розмірами, використовуючи convert(наприклад, convert -delay 50 1.gif 2.gif -loop 0 animated.gif).

Проблема полягає в тому, що перетворення просто перекриває зображення, використовуючи розмір першого зображення як розмір анімованого gif, а оскільки вони мають різні розміри, результат є трохи безладом, при цьому біти старих кадрів відображаються під новими.



Що таке "розмір пікселя"? Біти на піксель (глибина) чи кількість пікселів?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


50

знайшов рішення: identifyчастина пакету imagemagick робить саме те, що мені потрібно

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

Чи можете ви пояснити, чому я отримав кілька рядків під час запуску 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

Замість того, щоб проаналізувати висновок identifyоком або текстовими утилітами, ви можете використовувати його -formatпараметр для виведення ширини та висоти у будь-якому форматі, який вам найбільше підходить. Наприклад:

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

Перелік властивостей зображення, який можна вивести, ви можете знайти на цій сторінці , але для питання тут, здається, все, що вам потрібно, %wі %hякі дають ширину та висоту зображення відповідно у пікселях.


Гнучкість, що надається компанією, -formatбула мені корисною для пошуку найбільших зображень за пікселями, шляхом виведення %[fx:w*h]для декількох зображень та сортування результатів.

Ви можете вказати -pingпараметр, якщо ви обробляєте багато зображень, використовуючи складніші епізоди, і хочете, щоб програма не витрачала час на завантаження всіх зображень. З простими втечами, -pingза замовчуванням має бути. Більш детальну інформацію про вибір між -pingі +pingможна знайти тут .


15

ви можете просто скористатися командою "файл", щоб отримати необхідну інформацію:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced

1
Це НЕ повідомляє розмір для інших (не 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

Неправда, це принаймні в останніх версіях macOS.
rien333

5

Використовуйте identifyдля перегляду розмірів:

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

Значення вилучення через cut | sed, з поля 3:

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

Призначити змінній:

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

2

Обидва displayі fileдосить повільно, і є потенціал , щоб принести навіть цілком здатні системи на колінах , що стосуються багатьох декількох файлів. Невеликий тест:

     $ 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

Читаючи лише необхідні байти, цю операцію можна значно прискорити.

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

Ось 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;
}

Цей спосіб набагато швидше, ніж використання бібліотеки, яка завантажує PNG вперед, назад і вбік, щоб отримати розмір зображення: P (Розгляньте код уважно, перш ніж подавати його в каталог, повний довільних PNG, звичайно.)

Користі коду inet.h для Htonl () для де- Endian -ize упорядкування байт заголовка.


0

Ви також можете спробувати GraphicsMagick , який є доглянутою виделкою ImageMagick, який використовується, наприклад, у Flickr та Etsy:

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

Це швидше, ніж виявити ImageMagick (у моїх тестах приблизно вдвічі).


0

Це був корисний фрагмент (я не писав), який повертає розміри для кожного png та jpg у папці:

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

0

Для таких, як я, хто хоче розмір у мегапікселях:

perl -le "printf \"=> fileName = %s size = %.2f Mpix\n\", \"$fileName\", $(identify -format '%w*%h/10**6' $fileName)"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.