pgmagick tips
Posted on Sun, 27 Mar 2011 05:36:54 +0900
他人のふんどしでばかり相撲をとってすみません(´Д`。)
pgmagick でもできるか試してみたかったので、以下2つの記事をなぞってみました。
image diff (2つの画像の差分をとる)
pgmagickで2つの画像の差分をとるコードは以下のようになります。
from pgmagick import Image
from pgmagick import CompositeOperator as co
img_a = Image('a.jpg')
img_b = Image('b.jpg')
img_c = Image('c.jpg')
print img_a.compare(img_b)
print img_a.compare(img_c)
#img_a.composite(img_b, 0, 0, co.DifferenceCompositeOp)
img_a.composite(img_c, 0, 0, co.DifferenceCompositeOp)
img_a.write('diff.jpg')



画像がシュール。
画像の縮小を高速化する
pgmagickではBlobから読み出すことで画像の縮小を高速化できました。
import pgmagick
# fast read
img = pgmagick.Image(pgmagick.Blob(open('org.jpg').read()), pgmagick.Geometry(180, 120))
img.scale('180x120')
img.write('t.jpg')
# slow read
img = pgmagick.Image('org.jpg')
img.scale('180x120')
img.write('t.jpg')
Imageクラスの1パラ目にBlobデータ、2パラ目にGeometryでサイズを指定すると JPEGの読み込みサイズがサイズ指定した値に近くなり、結果メモリ確保サイズが 少なくなるため高速化できるようです。 pgmagick(GraphicsMagick)は -define jpeg:size は指定できませんので、 mirakuiさんの記事でいうところの -size オプション付加したときと同等ですね。 JPEG、縮小サイズが分かっている時限定です。
以前測定したベンチマーク をアップデートしてみました。

おお、スケールに限定するとpgmagickいい勝負してるよ!!
おわりに
pgmagickでもできましたー、と。 Pythonを使っていてシステム関数でconvertコマンドたたいたりしたくないときとかはpgmagickをどうぞ。