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

Поместите другую команду там для еды сигнала из программы смерти.

Я попробовал Ваш пример, initally как показано, чтобы доказать, что проблема... 'killall сон' уничтожает спящий процесс, удар прерываний и выходы xargs.

Как тест, я придерживался 'выполненный другая команда' команда типа промежуточный xargs и удар... в этом случае '/usr/bin/time'. на этот раз (никакая игра слов), killall сон уничтожает спящий процесс, но xargs продвигается.

Вы передали бы вывод времени по каналу к/dev/null, и это сделает точно, что Вы ищете без майора, переписывают Вашего существующего процесса.

Я воображаю, обдумываю ли я на мгновение, я мог бы придумать другую программу, чтобы сделать то же без болтовни stderr от '/usr/bin/time'. Или даже запишите тот самостоятельно, это - просто 'ветвление' (или должностное лицо () производная).

Не забудьте использовать '/usr/bin/time', поскольку я не уверен, что встроенное 'время' от удара сделает ту же 'еду' сигнала.

46
13.05.2013, 14:24
9 ответов

найденный решением: identify, часть imagemagick пакета, делает точно, в чем я нуждаюсь

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

можно просто использовать команду "файл" для получения информаций, в которых Вы нуждаетесь:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
16
27.01.2020, 19:34
  • 1
    Это НЕ сообщает о размере для других (non-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 gray 09.10.2014, 20:48

Оба 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 (Рассмотрите код тщательно прежде, чем подать его каталог, полный произвольного PNGs, конечно.)

Код использует inet.h для htonl () к de-endian-ize порядок байтов заголовка.

2
27.01.2020, 19:34

Использование Определите , чтобы увидеть размеры:

$ 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

Asign для переменной:

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
5
27.01.2020, 19:34

Также можно попробовать 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
27.01.2020, 19:34

ls * info *

Здесь должны быть перечислены все файлы в этом каталоге, которые имеют info в любом месте своего имени.

-121--174238-

Я смог запустить его с неофициальным хранилищем yum, которое было опубликовано здесь: https://copr.fedoraproject.org/coprs/admiralnemo/i3wm-el7 . На этой странице содержатся хорошие инструкции.

-121--186609-

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

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

Список свойств изображения, которые вы можете вывести, можно найти на этой странице , но для вопроса здесь, кажется, все, что вам нужно, это % w и % h , которые дают ширину и высоту изображения, соответственно, в пикселях.


Гибкость, обеспечиваемая -форматом , пригодилась мне при поиске самых больших изображений в пикселях, выводе % [fx: w * h] для нескольких изображений и сортировке выходных данных.

Вы можете указать опцию -ping , если вы обрабатываете много изображений, используя более сложные переходы, и хотите убедиться, что программа не тратит время на загрузку всех изображений. При использовании простых переходов значение по умолчанию должно быть -ping . Дополнительную информацию о выборе между -ping и + ping можно найти здесь .

46
27.01.2020, 19:34

Это был полезный фрагмент (я не писал), который возвращает размеры для каждого png и jpg в папке:

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

Для таких, как я, которым нужен размер в мегапикселях:

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

Добавлено в акт:

$ npm install @lancejpollard/act -g
$ act read image.png --size

    2000x2000
0
23.07.2020, 13:08

Теги

Похожие вопросы