이미지의 픽셀 크기를 얻는 쉘 명령


42

이미지의 픽셀 크기를 반환하는 쉘 명령이 있습니까?

convert(예 :)를 사용하여 크기가 다른 다른 GIF에서 시작하는 애니메이션 GIF를 생성하려고합니다 convert -delay 50 1.gif 2.gif -loop 0 animated.gif.

문제는 변환이 애니메이션 gif의 크기로 첫 번째 이미지의 크기를 사용하여 이미지를 단순히 겹치는 것입니다. 크기가 다르기 때문에 결과는 약간 혼란스러워지며 이전 프레임의 비트는 새 프레임 아래에 표시됩니다.



"픽셀 크기"란 무엇입니까? 픽셀 당 비트 수 (깊이) 또는 픽셀 수?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

답변:


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"명령을 사용하여 필요한 정보를 얻을 수 있습니다.

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

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를 앞뒤로로드하는 라이브러리를 사용하는 것보다 훨씬 빠릅니다.

코드 용도를 위해 inet.h () htonl 탈에 엔디안 -ize 헤더 바이트 순서.


0

Flickr 및 Etsy에서 사용되는 잘 관리 된 ImageMagick 포크 인 GraphicsMagick 을 사용해 볼 수도 있습니다 .

$ 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)"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.