[応用編] Imagemagickの処理時間を高速化するコツ

-draw -size -resize -frame +swap

Imagemagickスピードアップ

 

皆さまこんにちは。

本日はImagemagickの処理時間をできるだけ早くするためのコツについてです。

 

WEBサービスなどのサムネ生成などで画像処理を複数同時に行うときなど、塵ツモで処理時間がかかってしまうことなどあると思います。

そういった場合に、できるだけ処理時間を短くするための書き方のコツを幾つかまとめてみたいと思います。

 

 

1.先に縮小してから処理を開始する

 

Imagemagickは、構文の左から右へ順に処理を実行していきます。

そのため、サムネイルの生成など、画像を最終的に縮小して吐き出す場合には、先に縮小してから合成処理などをする方が処理時間は早くなります。

 

使用画像 )

in.png  ( 4000 x 4000 pixel)

 

今回は実験として上記アンモナイトの背景透過PNG画像を使用してみます。

サイズは4000 x 4000 pixel とかなり大きめの画像です。

 



 

この画像を以下のように、500 x 500 pixelの背景白、1pixelのボーダー付きJPEG画像 に変換します。

 

完成形 )

exit.jpg ( 502 x 502 pixel ※ボーダー含 )

 

パターン 1 )   先に縮小してから合成

convert \( in.png -resize 500x500 \) \( -size 500x500 xc:white \) +swap -gravity center -compose over -composite -frame 1x1 exit.jpg

実行結果)

処理時間 )   1.6046 秒

 

パターン 2 )  合成してから最後に縮小

convert in.png \( -size 4000x4000 xc:white \) +swap -gravity center -compose over -composite -resize 500x500 -frame 1x1 exit.jpg

実行結果)

処理時間 )   2.4722 秒

 

このように、最終的に画像が縮小される場合には、先に縮小してから合成処理を開始する方が、処理時間が短くなります。

 

しかし、大きい画像をそのままのサイズで処理する場合には、この方法は使えませんね。

でも実は、そういった場合にも使えるやり方もあります。

 

それについては別記事でまとめたいと思いますので少々お待ちください。

 

 

2. できるだけ処理を1文にまとめる

 

2つ目のコツとして、できるだけ処理を1文でまとめて書くというのがあります。

自分も昔そうだったのですが、慣れていないと処理を小分けにしてしまいがちです。

ですが、できるだけ1文でまとめた方が、処理時間も短くなりますし、不要な画像が散らかることもなくなります。

 

今回は上で使った同じアンモナイト画像を、

こんな感じのJPEG画像(500 x 500 pixel) に加工してみます。

実行手順としては、



 

500pixelに縮小して、背景にブルーをあてて合成

500pixelの円を生成

アンモナイト画像を円で切り抜き

背景にグリーンをあてて合成、JPEGで出力

 

という流れです。

 

パターン 1 )   1文にまとめて実行

convert \( in.png -resize 500x500 \) \( -size 500x500 xc:blue \) +swap -gravity center -compose over -composite \( -size 500x500 xc:none -draw "circle 250,250 250,0" \) -virtual-pixel transparent -gravity center -compose Dst_in -composite \( -size 500x500 xc:green \) +swap -gravity center -compose over -composite exit.jpg

実行結果)

処理時間 )   1.616 秒

 

パターン 2 )   途中経過画像を書き出しつつ、複数文で実行

convert \( in.png -resize 500x \) \( -size 500x500 xc:blue \) +swap -gravity center -compose over -composite step.jpg

convert  -size 500x500 xc:none -draw "circle 250,250 250,0" circle.png
convert step.jpg circle.png -virtual-pixel transparent -gravity center -compose Dst_in -composite step2.png
convert step2.png \( -size 500x500 xc:green \) +swap -gravity center -compose over -composite exit.jpg

実行結果)

処理時間 )   2.009 秒

 

このように、途中で画像を一旦書き出して、次の構文でその画像を使用して合成 という書き方ですと、処理時間が遅くなることがわかります。

また途中経過の画像が残るので、それを一々削除するのも面倒です。



慣れないうちはパーツごとにテストしつつ、最後に合体させて構文を完成させてみてください。

 

 

3. 一文にまとめるコツ

 

実はImagemagickには、構文を1文にまとめるのに非常に役立つオプションや特殊フォーマットが用意されています。

それらを使用することで、例えば convertコマンドとcompositeコマンドを一文でまとめることも可能です。

 

ここで書くと長くなってしまうので、次回そういった便利なオプションや特殊フォーマットについて解説したいと思います。

 

(追記)

[応用編] Imagemagickの処理時間を高速化するコツ2 / miff: を使って構文を繋げる

に続きを掲載しました。

 

では本日はここらへんで。