HOME > CONIT Labs.

CONIT Labs.

Django + PILで画像を合成


こんにちは、いちかわです。

今回は、Pythonを使ってリアルタイムに画像を合成する方法を紹介します。

Pythonで画像処理を行うとしたらOpenCVとかも使えるのですが、「Python Imaging Library」を使えばもっと簡単に画像を扱うことができます。

今回は、以下の環境で試しています。

Fedora8

Apache2.2+mod_python

Django 1.2.1

Python 2.5.1

では簡単にインストールの説明です。

PILで必要となるライブラリをインストールします。

次にPIL

*easy_install PIL でやろうとすると、
「No local packages or download links found for PIL」
と怒られてしまいました。。

では、正しくインストールされたか、調べてみましょう。

$ python

>>> import Image

>>> Image.VERSION

’1.1.6′

と表示されればオッケーです。

では、次は画像を合成してみます。

用意した画像は、サイズが57×57のPNGファイルです。

ベースの画像

重ねる画像(透過PNGです)

コードを書いていきましょう。

まずは、PILのインポート

import Image

次に、背景画像(例では画像はソースファイルと同じフォルダにある事を想定)

backImage = Image.open(‘%s/huffpuff.png’ % os.path.dirname(__file__) )

重ねる画像(Alphaの情報が必要なので、”RGBA”

item = Image.open(‘%s/banana.png’ % os.path.dirname(__file__) ).convert(‘RGBA’)

位置を指定して重ねる

backImage.paste(item,(0,0), item)

合成画像を作成

new_image = backImage.convert(‘RGB’).convert(‘P’, palette=Image.ADAPTIVE)

画像の保存

new_image.save(‘new_huffpuff.png’, “PNG”)

たったこれだけです。

そして、出来上がった画像はこんな感じ。

PILスゲー!!

ちなみに、題名にある「Django」が今までの説明で、全く出てきていません。。

実際、画像を合成するだけであれば、専用のソフトを使った方が色々便利であえてPythonを使う必要はないと思います。

しかし、Webアプリで動的に画像を合成して、遊びたい!!と思った時に、Django+PILの出番です。

PILでは、画像の出力方法として、

Image.save():ファイル等に保存

Image.show():GUI環境ならビューア内に表示

が用意されているのですが、これをどうやってレスポンスとして返すか悩みました。

PILのドキュメントを見ると

im.save(outfile, format, options…)

と説明されており、ファイル出力のみに対応している様に見えます。

しかし、説明では

You can use a file object instead of a filename. In this case, you must always specify the format. The file object must implement theseektell, and write methods, and be opened in binary mode.

って書かれています。ってことは、seek、tell、writeが実装されていればOK?

そして、DjangoのHttpResponseはwriteメソッドを持っています。

saveにHttpResponseを渡せばイケるのでは!!

というわけで、先ほどのsave部分を以下のように変えます。

res = HttpResponse(mimetype=’image/png’)
new_image.save(res, “PNG”)
return res

無事、レスポンスに画像データが書き込まれました。

Django+PILは、Google App Engineでも使われている組み合わせですので、twitterのアイコンに何かを合成するアプリとか、簡単に作れそうですね。

注:Google App Engineでは、同じ組み合わせと言っても、独自拡張しているので、今回説明した方法がそのまま使えるとは限りません。

コメントを残す

コニット開発室

CONIT Official Tweet

CONIT Facebook FanPage

CONIT BLOG

株式会社コニット

SamuraiSmartphoneServices

Buy and take only medicines from online pharmacy ,]}$ drugs online has affordable prices. Brand name drugs Canadian pharmacy [*}: compare drug prices Canada delivering medicines at your door. Free online consultation at https://canada-pharmacy-store.com <;) order cialis highest value and quality. Is it legal to mail prescription drugs? Yes, Canadian drugs [.($ order viagra . After ordering you will be contacted by our managers and agree on the delivery details.