画像のピクセルサイズを返すシェルコマンドはありますか?
私が使用してさまざまなサイズと異なるgifsから始まるアニメーションGIFを作成しようとしているconvert(例えばconvert -delay 50 1.gif 2.gif -loop 0 animated.gif)。
問題は、変換が最初の画像のサイズをアニメーションGIFのサイズとして使用して画像を単純にオーバーラップすることです。サイズが異なるため、結果は少し混乱し、古いフレームのビットが新しいフレームの下に表示されます。
画像のピクセルサイズを返すシェルコマンドはありますか?
私が使用してさまざまなサイズと異なるgifsから始まるアニメーションGIFを作成しようとしているconvert(例えばconvert -delay 50 1.gif 2.gif -loop 0 animated.gif)。
問題は、変換が最初の画像のサイズをアニメーションGIFのサイズとして使用して画像を単純にオーバーラップすることです。サイズが異なるため、結果は少し混乱し、古いフレームのビットが新しいフレームの下に表示されます。
回答:
解決策が見つかりました: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
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見つけることができるここに。
コマンド「file」を使用して、必要な情報を取得できます。
~# file cha_2.png
cha_2.png: PNG image data, 656 x 464, 8-bit/color RGB, non-interlaced
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"
を使用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
両方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;
}
この方法は、画像サイズ:Pを取得するためにPNGを前後、左右にロードするライブラリを使用するよりもはるかに高速です(もちろん、任意のPNGでいっぱいのディレクトリにフィードする前にコードを慎重に検討してください)。
また、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回)。