afnf.net

Pillowでかんたん画像処理

Python Pillow 画像処理 Android 2014/07/06 23:11

概要

twawm2のために、1000枚以上の画像を用意する必要がありました。手動でやるのはさすがに非生産的なので、Pythonの画像処理ライブラリPillowで生成してみました。

目的

解像度別の5種、バッテリー残別の12種、通信モード・アンテナレベル別の23種について、画像を用意。ここは手動。つらい。

ここまでできたら、ループを回して透過色で重ね合わせ。5*12*23=1,380枚のpngを作ります。

20140706_icon_concated

※この画像もPillowで作りました。nodpiは省略。

手順

  1. Pythonインストール。なんとなく2.7。
  2. ez_setupをダウンロードしてインストール。
  3. easy_install PillowでPillowをインストール。
  4. 以下を実行
# encoding: utf-8
from PIL import Image

base = "D:/android/app/twawm/orig_images/twawm2/"
dirs = ("drawable-xhdpi", "drawable-hdpi", "drawable-mdpi", "drawable-ldpi" , "drawable-nodpi")
batts = ("batt_000", "batt_010", "batt_020", "batt_030", "batt_040", "batt_050", "batt_060", "batt_070", "batt_080", "batt_090", "batt_100", "batt_na")
wimaxs = ("wimax_gray", "wimax_green_1", "wimax_green_2", "wimax_green_3", "wimax_green_4", "wimax_green_5", "wimax_green_6", "wimax_white")

for d in dirs :
    path = base + d
    outpath = base + "out/" + d

    for batt in batts :
        batt_name = path + "/notif_" + batt + ".png"

        battfile = Image.open(batt_name)
        batt_alpha = battfile.split()[3]

        hsfile = Image.open(path + "/notif_wimax_hs.png")
        hs_alpha = hsfile.split()[3]

        for wimax in wimaxs :
            wimax_name = path + "/notif_" + wimax + ".png"

            wimaxfile = Image.open(wimax_name)
            wimax_alpha = wimaxfile.split()[3]

            canvas = Image.new('RGBA', battfile.size, (255, 255, 255, 0))
            canvas.paste(battfile, (0, 0), mask=batt_alpha)
            canvas.paste(wimaxfile, (0, 0), mask=wimax_alpha)
            canvas.save(outpath + "/ntficon_" + wimax + "_" + batt + ".png")

            canvas.paste(hsfile, (0, 0), mask=hs_alpha)
            canvas.save(outpath + "/ntficon_hs_" + wimax + "_" + batt + ".png")

# Wi-Fiスポット画像の生成は省略

ポイント

合成の土台として、指定解像度のImageを用意します。透過合成をする場合、土台にもアルファチャネルを持つ必要があるらしいです。

canvas = Image.new('RGBA', battfile.size, (255, 255, 255, 0))


透過合成するためには、Image.pasteでmaskでアルファチャネルを指定します。これは元画像から取得できます。

batt_alpha = battfile.split()[3]

ちなみに、Pillowのフォーク元であるPILだと、先だってloadしないとsplitできませんでした。Pillowはload不要の模様です。

感想

とっても簡単でした。この程度の使い捨てのプログラムだと、Pythonのような言語がお手軽でいいですね。

Pythonは本当に素直な言語だと思いますが、ライブラリ周りでつまずきました。Pillowの前にPILを試していたのですが、PILアンインストール後のPillowインストールで依存関係が壊れてしまったようで、以下のようなエラーが出てしまいました。

AttributeError: class Image has no attribute 'open'

色々試しましたが解決できず、結局Pythonを再インストールして解消。うーん。

Python Pillow 画像処理 Android 2014/07/06 23:11
comments (0)

blog-java2 engine (build:2017-09-13 21:46 JST)