команда оболочки, чтобы получить размер изображения в пикселях


44

Есть ли команда оболочки, которая возвращает размер изображения в пикселях?

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

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



Что такое «размер пикселя»? Биты на пиксель (глубину) или количество пикселей?
— Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:


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

45

Вместо того, чтобы анализировать выходные данные 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» для получения необходимой информации:

~# 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.