web-dev-qa-db-ja.com

画像のピクセルサイズを取得するシェルコマンド

画像のピクセルサイズを返すシェルコマンドはありますか?

convertを使用して、異なるサイズの異なるgifから始まるアニメーションgifを作成しようとしています(例:convert -delay 50 1.gif 2.gif -loop 0 animated.gif)。

問題は、変換が最初の画像のサイズをアニメーションGIFのサイズとして使用して画像を単純にオーバーラップすることです。それらのサイズが異なるため、結果は少し混乱し、古いフレームのビットが新しいフレームの下に表示されます。

56
blue

解決策を見つけました:imagemagickパッケージの一部であるidentifyは、必要なものを正確に実行します

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

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のどちらを選択するかについての詳細は、 ここ を参照してください。

53
Dan Getz

コマンド「file」を使用して、必要な情報を取得できます。

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

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
5
Hugolpz

displayfileはどちらも非常に低速であり、非常に能力のあるシステムでさえ、多数の複数のファイルを処理する可能性があります。小さなテスト:

     $ 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(前にコードを慎重に検討してくださいもちろん、任意のPNGでいっぱいのディレクトリをフィードします。)

このコードは htonl() にinet.hを使用して、ヘッダーバイトの順序をde - endian -izeにしています。

2
i336_

GraphicsMagick を試すこともできます。これは、たとえば、 FlickrとEtsy:

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

ImageMagickの識別よりも高速です(私のテストでは約2回)。

0
Jerry Epas

これは、フォルダー内のすべてのpngとjpgの寸法を返す便利なスニペット(私は記述しませんでした)でした:

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

メガピクセルのサイズが欲しい私のような人のために:

Perl -le "printf \"=> fileName = %s size = %.2f Mpix\n\", \"$fileName\", $(identify -format '%w*%h/10**6' $fileName)"
0
SebMa