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

私が歌川です

@utgwkk が書いている

Python Image Library (PIL) を使って画像をHTMLで表そう+α

技術

はじめに

うたがわきき です。
Pythonで、コマンドラインの暗くて狭い世界を抜けだそうキャンペーン(そんなものはない)の一環として、今回は画像処理をしてみようと思います。

f:id:utagawakiki:20130915162215p:plain

まずはこの画像を用意します。赤蛮奇です。誰が何と言おうと赤蛮奇です。
この画像にあんなことやこんなことをしてみようと思います。
ここに書いてあることを再現するときには、上の画像をダウンロードするといいと思います。

その前に

Pythonの導入は済んだか? 小僧。ここからPython2.7.5(3.xではない)をダウンロード、インストールしてください。

続いて、ここから、Pillowのwin32、py2.7と書いてあるものを導入してください。

64bit環境向け

64bit環境の方は、同じサイトからamd64、py2.7と書いてあるものを導入してください。

次に

オメデトウ。これで今日から画像処理プログラミングができるね!
コードの初めに、

from PIL import Image

と書けば、画像処理の準備は完了です。やったぜ。

まずは基本形

from PIL import Image

img = Image.open('sekibanki.png')
print img.size
print img.format
print img.mode

実行結果

(24,24)
PNG
RGBA

解説

オブジェクト指向わかりません。
img = Image.open('sekibanki.png') で、画像を扱うオブジェクトを作っているようです。
img.size は画像のサイズ(横幅,縦幅)、img.format は画像の形式、img.modeはRGBなどの色のモード(?)を……何だこの適当さは。
img.mode で RGBA となっているのは、画像が透過されているということを表しています。

そんなことはどうでもいい

今日作るのはこれです。

\デュン!/

f:id:utagawakiki:20130915163953p:plain

ズバリ、読み込んだ画像をHTMLで表す、という何とも使い道の分からないモノです。
意外と簡単にできました。

コード

# -*- coding: utf-8 -*- 
from PIL import Image

img = Image.open("sekibanki.png").convert('RGB')
size = img.size
f = open("output.htm","w")

ch = '■'  # 置き換える文字

f.write('<div style="font-size:50%;">')
for y in range(size[1]):
  for x in range(size[0]):
    r,g,b = img.getpixel((x,y))
    f.write('<span style="color:#%02x%02x%02x;">%s</span>'%(r,g,b,ch))
  f.write('<br>')
f.write('</div>')

解説

画像を開いてRGB形式に変換。透過とかされても分からないからね。
変数sizeに画像のサイズを格納。できたHTMLはoutput.htmに出力することにするよ。
変数chは置き換える文字。そのまんまだね。
<div style="font-size:50%;"> としてあるところは、各自でいじっていいです。
本当は、<font>タグを使いたかったけど、いかんせん古めかしいんだよなあ。ちぇっ。
カラーコードは16進数で表すからね。

できあがったのが、さっきの。

おまけ

色反転

from PIL import Image

img = Image.open("sekibanki.png").convert('RGB')
size = img.size
newimg = Image.new('RGB',size)

for x in range(size[0]):
  for y in range(size[1]):
    r,g,b = img.getpixel((x,y))
    newimg.putpixel((x,y),(255-r,255-b,255-g))

newimg.save("sekibanki_.png")
できあがったもの

f:id:utagawakiki:20130915170016p:plain

わりとわかりやすいね。

赤みをかける

from PIL import Image

img = Image.open("sekibanki.png").convert('RGB')
size = img.size
newimg = Image.new('RGB',size)

for x in range(size[0]):
  for y in range(size[1]):
    r,g,b = img.getpixel((x,y))
    newimg.putpixel((x,y),(r+150,b,g))

newimg.save("sekibanki_.png")
できあがったもの

f:id:utagawakiki:20130915170440p:plain

これも分かりやすい。

セピア調

自分でさがしてください

あとがき

もっと効率的なコードが書きたい