lệnh shell để có được kích thước pixel của hình ảnh


43

Có một lệnh shell trả về kích thước pixel của hình ảnh không?

Tôi đang cố gắng tạo ra một gif hoạt hình bắt đầu từ các gif khác nhau với các kích cỡ khác nhau bằng cách sử dụng convert(ví dụ convert -delay 50 1.gif 2.gif -loop 0 animated.gif).

Vấn đề là việc chuyển đổi chỉ đơn giản là chồng lấp các hình ảnh bằng cách sử dụng kích thước của hình ảnh đầu tiên là kích thước của gif hoạt hình và vì chúng có kích thước khác nhau nên kết quả là một mớ hỗn độn, với các bit của các khung hình cũ hiển thị dưới các hình ảnh mới.



"Kích thước pixel" là gì? Số bit trên mỗi pixel (độ sâu) hoặc số pixel?
Ciro Santilli 心 心 事件

Câu trả lời:


50

đã tìm thấy một giải pháp : identify, một phần của gói hình ảnh, thực hiện chính xác những gì tôi cần

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

Bạn có thể giải thích tại sao tôi có nhiều hàng khi tôi chạy identify imagename.icokhông? 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

Thay vì phân tích đầu ra identifybằng mắt hoặc bằng các tiện ích văn bản, bạn có thể sử dụng -formattùy chọn của nó để xuất chiều rộng và chiều cao ở bất kỳ định dạng nào phù hợp với bạn nhất. Ví dụ:

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

Một danh sách các thuộc tính hình ảnh mà bạn có thể đầu ra có thể được tìm thấy trên trang này , nhưng đối với câu hỏi ở đây, có vẻ như tất cả các bạn cần là %w%h, trong đó cung cấp cho chiều rộng và chiều cao của hình ảnh, tương ứng, tính theo pixel.


Tính linh hoạt được cung cấp có -formatích cho tôi trong việc tìm kiếm hình ảnh lớn nhất về pixel, bằng cách xuất ra %[fx:w*h]một số hình ảnh và sắp xếp đầu ra.

Bạn có thể muốn chỉ định -pingtùy chọn nếu bạn đang xử lý nhiều hình ảnh, sử dụng các lối thoát phức tạp hơn và muốn đảm bảo chương trình không lãng phí thời gian tải toàn bộ hình ảnh. Với lối thoát đơn giản, -pingnên được mặc định. Thông tin thêm về sự lựa chọn giữa -ping+pingcó thể được tìm thấy ở đây .


15

bạn chỉ có thể sử dụng lệnh "file" để nhận thông tin bạn cần:

~# file cha_2.png 
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced

1
Điều này KHÔNG báo cáo kích thước cho các loại hình ảnh (không phải png) khác ... 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 xám

Không đúng, ít nhất là trong các phiên bản macOS gần đây.
rien333

5

Sử dụng identifyđể xem kích thước:

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

Trích xuất giá trị qua cut | sed, từ trường 3:

identify ./color.jpg | cut -f 3 -d " " | sed s/x.*// #width
identify ./color.jpg | cut -f 3 -d " " | sed s/.*x// #height

Sắp xếp theo biến:

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

Cả hai displayfilekhá chậm, và có khả năng đưa các hệ thống thậm chí khá có khả năng đến đầu gối của họ xử lý nhiều tệp. Một bài kiểm tra nhỏ:

     $ 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

Bằng cách chỉ đọc các byte cần thiết, thao tác này có thể được tăng tốc đáng kể.

     $ /usr/bin/time ./pngsize *.png
-->  0.00user 0.00system 0:00.03elapsed 12%CPU (0avgtext+0avgdata 1904maxresident)k
     0inputs+0outputs (0major+160minor)pagefaults 0swaps

Đây là 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;
}

Phương pháp này là nhiều nhanh hơn so với sử dụng một thư viện mà tải các PNG về phía trước, phía sau và ngang chỉ để có được kích thước hình ảnh: (. Hãy xem xét mã một cách cẩn thận trước khi cho ăn nó một thư mục đầy đủ của PNG tùy ý tất nhiên) P

Việc sử dụng đang inet.h cho htonl () để de- endian -ize thứ tự tiêu đề byte.


0

Bạn cũng có thể dùng thử GraphicsMagick , một nhánh của ImageMagick được duy trì tốt được sử dụng tại vd: Flickr và Etsy:

$ gm identify a.jpg
a.jpg JPEG 480x309+0+0 DirectClass 8-bit 25.2K 0.000u 0:01

Nó nhanh hơn nhận dạng của ImageMagick (trong các thử nghiệm của tôi khoảng hai lần).


0

Đây là một đoạn hữu ích (tôi không viết) trả về kích thước cho mỗi png và jpg trong thư mục:

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

0

Đối với những người như tôi, những người muốn kích thước tính bằng megapixel:

perl -le "printf \"=> fileName = %s size = %.2f Mpix\n\", \"$fileName\", $(identify -format '%w*%h/10**6' $fileName)"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.