이미지의 픽셀 크기를 반환하는 쉘 명령이 있습니까?
convert
(예 :)를 사용하여 크기가 다른 다른 GIF에서 시작하는 애니메이션 GIF를 생성하려고합니다 convert -delay 50 1.gif 2.gif -loop 0 animated.gif
.
문제는 변환이 애니메이션 gif의 크기로 첫 번째 이미지의 크기를 사용하여 이미지를 단순히 겹치는 것입니다. 크기가 다르기 때문에 결과는 약간 혼란스러워지며 이전 프레임의 비트는 새 프레임 아래에 표시됩니다.
답변
해결책을 찾았습니다 : identify
imagemagick 패키지의 일부로, 내가 필요한 것을 정확하게 수행합니다.
$ identify color.jpg
> color.jpg JPEG 1980x650 1980x650+0+0 8-bit DirectClass 231KB 0.000u 0:00.000
답변
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
찾을 수 있습니다 여기에 .
답변
“file”명령을 사용하여 필요한 정보를 얻을 수 있습니다.
~# file cha_2.png
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
답변
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
답변
모두 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를 앞뒤로로드하는 라이브러리를 사용하는 것보다 훨씬 빠릅니다.
답변
Flickr 및 Etsy에서 사용되는 잘 관리 된 ImageMagick 포크 인 GraphicsMagick 을 사용해 볼 수도 있습니다 .
$ gm identify a.jpg
a.jpg JPEG 480x309+0+0 DirectClass 8-bit 25.2K 0.000u 0:01
ImageMagick의 식별보다 빠릅니다 (내 테스트에서 약 두 번).
답변
이것은 폴더에있는 모든 png 및 jpg의 크기를 반환하는 유용한 스 니펫 (쓰기하지 않았습니다)입니다.
file ./* | perl -ne '@m = /^.*.jpg|^.*.png|[0-9][0-9]*[ ]?x[ ]?[0-9][0-9]*/g; print "@m\n"'