読者です 読者をやめる 読者になる 読者になる

PythonMagickWandを使ってEXIFを削除する

Python ImageMagick

ImageMagickを使うとモテるらしいという話を聞き、いまさらながら使ってみた。
今回はImageMagickはyumで入れた。yumとかaptじゃなかったら、インストール時点で挫折していたと思う。

$ sudo yum install ImageMagick-devel ImageMagick-c++-devel


PythonからImageMagickを使うに当たっては、C++のバインディングであるPythonMagickと、ctypesを使ったPythonネイティブのライブラリがあるようだ。
両方試してみようと思ったが、PythonMagickはビルドが通らなくて、あえなく撃沈。PythonMagickWandだけでいいや、という結論に落ち着いた。

PythonMagickWand
http://www.procoders.net/?p=39
http://www.procoders.net/wp-content/pythonmagickwand.zip


配布物のPythonMagickWand.zipを解凍すると、PythonMagickWand.pyというファイルがあるので、これをPYTHONPATHが通っている場所に置く。ライブラリの検索パスがハードコーディングされているので、適宜置き換える。
yumでImageMagick-c++-develをインストールした場合ならば、

_magick = ctypes.CDLL('/usr/lib/libWand.so')

とする。
ソースのコメントを読むと、「macportsImageMagickで開発・テストをしている」と書いてあるので、macportsImageMagickを入れた場合には何も書き換えなくても動くのかもしれない。


今回はEXIFを削除するということをやってみたかったので、次のようなコードを試してみた。

import PythonMagickWand as magick
wand = magick.NewMagickWand()
magick.MagickReadImage(wand, "input.jpg")
magick.MagickProfileImage(wand, "*", None, 0)
magick.MagickWriteImage(wand, "output.jpg")

PythonMagickWandのドキュメントは無いに等しい状態なので、ImageMagick本体のソースコードや、PHPバインディング(MagickWandForPHP)ソースコードを読みながら書いた。ちょっと自信がないが、まあ、合っているんじゃないかな。


PythonMagickWandはctypesでごりごり書いているだけあって、ちょっと引数を間違えると簡単にSegmentation faultで落ちる。
そうでなくても、id:cocoitiから「ImageMagickは落ちる、落ちる(口説き落とせるという意味ではないらしい)」と聞かされているので、真剣に使うのは少し怖い。