एक छवि का पिक्सेल आकार प्राप्त करने के लिए शेल कमांड


43

क्या कोई शेल कमांड है जो किसी छवि का पिक्सेल आकार लौटाता है?

मैं अलग-अलग आकार convert(जैसे convert -delay 50 1.gif 2.gif -loop 0 animated.gif) के साथ अलग-अलग gif से शुरू होने वाले एक एनिमेटेड gif का उत्पादन करने की कोशिश कर रहा हूं ।

समस्या यह है कि कनवर्ट की गई छवियों को केवल एनिमेटेड gif के आकार के रूप में पहली छवि के आकार का उपयोग करके ओवरलैप किया जाता है, और चूंकि उनके अलग-अलग आकार होते हैं इसलिए परिणाम थोड़ा गड़बड़ होता है, नए फ्रेम के बिट्स नए बिट्स के नीचे दिखाई देते हैं।



"पिक्सेल आकार" क्या है? प्रति पिक्सेल (गहराई) या पिक्सेल गणना में बिट्स?
सिरो सेंटिल्ली 新疆 i i i 事件 '28

जवाबों:


50

एक समाधान मिला: identifyइमेजमेगिक पैकेज का हिस्सा, वही करता है जिसकी मुझे आवश्यकता है

$ 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
रोचासिनई

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
यह अन्य (गैर-पीएनजी) छवि प्रकारों के लिए आकार की रिपोर्ट नहीं करता ... 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

दोनों 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 को आगे, पीछे और बग़ल में लोड करता है बस छवि का आकार प्राप्त करने के लिए: P (कोड को ध्यान से देखें, यह निश्चित रूप से पीएनजी से भरा एक निर्देशिका को खिलाने से पहले।)

कोड inet.h का उपयोग करता है htonl () के लिए , हेडर बाइट ऑर्डर को डी- एंडियन करें


0

आप ग्राफ़िक्समैगिक को भी आज़मा सकते हैं , जो कि फ़्लिकर और ईटीएस में उपयोग की जाने वाली इमेजमैगिक का एक अच्छा रखरखाव फोर्क है:

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

यह ImageMagick की पहचान (दो बार के बारे में मेरे परीक्षणों में) से तेज है।


0

यह एक सहायक स्निपेट था (मैंने नहीं लिखा था) जो फ़ोल्डर में हर पीएनजी और जेम्‍स के आयाम देता है:

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)"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.