คำสั่ง shell เพื่อรับขนาดพิกเซลของรูปภาพ


42

มีคำสั่งเชลล์ที่ส่งคืนขนาดพิกเซลของรูปภาพหรือไม่

ฉันพยายามผลิต gif แบบเคลื่อนไหวโดยเริ่มจาก gif ต่าง ๆ ที่มีขนาดต่างกันโดยใช้convert(เช่นconvert -delay 50 1.gif 2.gif -loop 0 animated.gif)

ปัญหาคือการแปลงภาพซ้อนทับโดยใช้ขนาดภาพแรกเป็นขนาดของภาพเคลื่อนไหว gif และเนื่องจากมีขนาดแตกต่างกันผลที่ได้คือความยุ่งเหยิงโดยมีบิตของเฟรมเก่าที่แสดงภายใต้ภาพใหม่



"ขนาดพิกเซล" คืออะไร บิตต่อพิกเซล (ความลึก) หรือจำนวนพิกเซล?
Ciro Santilli 事件改造中心法轮功六四事件

คำตอบ:


50

พบวิธีแก้ไข: identifyส่วนหนึ่งของแพ็คเกจ imagemagick ทำสิ่งที่ฉันต้องการ

$ 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ตัวเลือกหากคุณกำลังประมวลผลภาพจำนวนมากโดยใช้ Escape ที่ซับซ้อนมากขึ้นและต้องการให้แน่ใจว่าโปรแกรมไม่ต้องเสียเวลาโหลดภาพทั้งหมด ด้วยการ-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"
alex grey

ไม่เป็นความจริงมันทำภายใต้ 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

ทั้งสอง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 ข้าง, ข้างหลังและด้านข้างเพียงเพื่อให้ได้ขนาดภาพ: (. พิจารณารหัสรอบคอบก่อนที่จะให้อาหารมันไดเรกทอรีเต็มรูปแบบของ PNGs โดยพลการของหลักสูตร) P

การใช้รหัส inet.h สำหรับhtonl ()เพื่อ de- endian -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)"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.