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


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.