Bir resmin piksel boyutunu elde etmek için shell komutu


42

Görüntünün piksel boyutunu döndüren bir kabuk komutu var mı?

convert(Örneğin convert -delay 50 1.gif 2.gif -loop 0 animated.gif) kullanarak farklı büyüklükteki farklı giflerden başlayarak animasyonlu bir gif üretmeye çalışıyorum .

Buradaki sorun, dönüştürmenin ilk görüntünün boyutunu animasyonlu gifin boyutu olarak kullanarak üst üste bindirmesidir ve farklı boyutlara sahip oldukları için sonuç eski karelerin bitlerinin yenilerinin altında göründüğü bir karışıklıktır.



"Piksel boyutu" nedir? Piksel başına bit (derinlik) veya piksel sayısı?
Ciro Santilli 事件 事件 中心 法轮功 六四 事件

Yanıtlar:


50

bir çözüm buldu: identifyimagemagick paketinin bir parçası, tam olarak ihtiyacım olanı yaptı.

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

Koştuğumda neden birden fazla satırım olduğunu açıklayabilir misiniz 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

Çıktısını identifygöze veya metin araçlarına göre ayrıştırmak yerine -format, genişliği ve yüksekliği en çok hangi formatta size uygunsa çıktısını almak için bu seçeneği kullanabilirsiniz . Örneğin:

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

Çıktılayabileceğiniz görüntü özelliklerinin bir listesi bu sayfada bulunabilir , ancak buradaki soru için ihtiyacınız olan tüm %wve %hgörüntünün piksel cinsinden genişliğini ve yüksekliğini veren görünümdür.


Elde edilen esneklik, bir dizi görüntü çıktısını alarak ve çıktıları sıralayarak -formatpikseller bakımından en büyük görüntüleri bulmakta benim için kullanışlı oldu %[fx:w*h].

Çok -pingsayıda görüntü işliyor, daha karmaşık kaçışlar kullanıyorsanız ve programın tüm görüntüleri yüklemek için zaman kaybetmediğinden emin olmak isteyip istemediğinizi belirtebilirsiniz . Basit çıkışlar -pingile, varsayılan olmalıdır. Arasındaki seçim hakkında daha fazla bilgi -pingve +pingbulunabilir burada .


15

İhtiyacınız olan bilgileri almak için sadece "file" komutunu kullanabilirsiniz:

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

1
Bu, diğer (png olmayan) resim türleri için boyutu DEĞİLDİR ... 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

Doğru değil, en azından son macOS versiyonlarında var.
rien333

5

identifyBoyutları görmek için kullanın :

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

Değer cut | sedalan 3'den:

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

Değişkene asign:

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

Hem displayve fileoldukça yavaştır ve birçok birden fazla dosya ile uğraşan dizlerinin bile oldukça yetenekli sistemlerini getirmek potansiyeline sahiptir. Küçük bir test:

     $ 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

Sadece gerekli baytları okuyarak, bu işlem önemli ölçüde hızlandırılabilir.

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

İşte 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;
}

Bu yöntem, yalnızca görüntü boyutunu elde etmek için PNG'yi ileri, geri ve yana yükleyen bir kütüphane kullanmaktan çok daha hızlıdır: P (Elbette isteğe bağlı PNG'lerle dolu bir dizini beslemeden önce kodu dikkatlice düşünün.)

Kod kullanımları için inet.h () htonl de- için endian -ize başlık bayt sıralaması.


0

Flickr ve Etsy'de kullanılan ImageMagick'in bakımlı bir çatalı olan GraphicsMagick'i de deneyebilirsiniz :

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

ImageMagick'in tanımladığından daha hızlı (yaklaşık iki kez testlerimde).


0

Bu, klasördeki her png ve jpg için boyutları döndüren yararlı bir snippet'ti (yazmadım):

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

0

Benim gibi megapiksel boyutunda isteyenler için:

perl -le "printf \"=> fileName = %s size = %.2f Mpix\n\", \"$fileName\", $(identify -format '%w*%h/10**6' $fileName)"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.