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


43

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

私が使用してさまざまなサイズと異なるgifsから始まるアニメーションGIFを作成しようとしているconvert(例えばconvert -delay 50 1.gif 2.gif -loop 0 animated.gif)。

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



「ピクセルサイズ」とは何ですか?ビット/ピクセル(深さ)またはピクセル数?
Ciro Santilli新疆改造中心法轮功六四事件

回答:


50

解決策が見つかりました:identifyimagemagickパッケージの一部で、まさに必要なことを行います

$ 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より複雑なエスケープを使用して多くの画像を処理し、プログラムが画像全体のロードに時間を浪費しないようにする場合は、オプションを指定することができます。単純なエスケープで-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.jpgtaylor-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

両方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;
}

この方法は、画像サイズ:Pを取得するためにPNGを前後、左右にロードするライブラリを使用するよりもはるかに高速です(もちろん、任意のPNGでいっぱいのディレクトリにフィードする前にコードを慎重に検討してください)。

コードは、htonl()にinet.hを使用して、ヘッダーのバイト順をデエンディアン化します。


0

また、GraphicsMagickを試すこともできます。これは、FlickrやEtsyなどで使用されているImageMagickのよく維持されたフォークです。

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

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


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.