pgmagick tips

他人のふんどしでばかり相撲をとってすみません(´Д`。)

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')
http://image.hexacosa.net/images/container/00000000000003d9_s.jpg http://image.hexacosa.net/images/container/0000000000000411_s.jpg http://image.hexacosa.net/images/container/0000000000000412_s.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、縮小サイズが分かっている時限定です。

以前測定したベンチマーク をアップデートしてみました。

http://image.hexacosa.net/images/container/0000000000000413_M.png

おお、スケールに限定するとpgmagickいい勝負してるよ!!

おわりに

pgmagickでもできましたー、と。 Pythonを使っていてシステム関数でconvertコマンドたたいたりしたくないときとかはpgmagickをどうぞ。