shell命令获取图像的像素大小


42

是否有Shell命令返回图像的像素大小?

我正在尝试使用convert(例如convert -delay 50 1.gif 2.gif -loop 0 animated.gif)从具有不同大小的不同gif开始生成动画gif 。

问题在于,转换仅使用第一个图像的大小作为gif动画的大小来重叠图像,并且由于它们的大小不同,因此结果有些混乱,旧帧的位在新帧下显示。



什么是“像素尺寸”?每像素位数(深度)还是像素数?
Ciro Santilli新疆改造中心法轮功六四事件

Answers:


50

找到了一个解决方案:identifyimagemagick软件包的一部分,正是我所需要的

$ 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"
亚历克斯·格雷

并非如此,至少在最新的macOS版本下才如此。
rien333 '18

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

这两个displayfile是相当缓慢的,并要带甚至很能系统跪着处理许多多个文件的可能性。一个小测试:

     $ 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()到去 -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)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.