Python で画像を編集する(結合・リサイズ・文字入れ)

Python
スポンサーリンク

Python を使った画像編集の方法について書く。作業記録寄りです。

はじめに

Extracting Dominant Colors From Images in Python を見て興味を持って、最終的に こういうこと をやってみたかった。動画は画像からdominantな色を抽出するのが主旨。とはいえ動画の内容は比較的単純で ColorThief という外部モジュールを使って get_palette を呼び出せば目的の色情報を取得できる

ColorThief

pip install ColorThief でインストールして使う。インスタンス化する際に画像ファイルを指定するだけで色を扱うことができる。コードは動画を参照してほしいが、取得する色数を指定する引数 color_count は想定している数+1を指定する必要があった

Pillow

画像処理ライブラリのひとつ。もともと PIL というモジュールがあったのだが、開発がストップして以降、後継ライブラリとして使われているようだ。インストールは pip install Pillow なのだが、インポートするときは from PIL import Image のように PIL になるので注意

画像を読み込んで Image オブジェクトを作ったり、サイズや色を指定して画像を作成することもできる。基本的な操作を書いておく

##### 画像ファイルを指定してオブジェクトを作成
img = Image.open('images/image.png')

##### 色と大きさを指定して新たな画像オブジェクトを作成
img = Image.new('RGB', (600, 400), (255, 255, 255))

##### ファイル名を指定して画像を書き出す
img.save('images/output.pmg')

##### 画像の情報諸々
img.size # (width, height)
img.width
img.height
img.format # 画像の形式
img.mode # 色の形式

白枠をつけたい

画像に白枠をつけたいと思った。これを実現するためには、元になる画像よりも一回り大きい白い画像オブジェクトを作成して、そこに元画像を貼り付ければ良い。画像の貼り付けには img.paste() という関数が使える。貼り付ける際に位置を座標で指定できるので (x, y) 座標に白枠の幅を指定すれば良いことになる

画像を縮小したい

大きする画像のサイズを変更するときには img.resize() という関数を使った。引数で高さと幅を指定できる。任意の倍率で変更したり、アスペクト比を固定してリサイズしたいときには、事前に高さと幅を計算しておけばよい。例えば、最大横幅が決まっていて、アスペクト比を保ったまま高さも縮小する場合は次のようなコードで書くことができる。

height_after = round(height_before * MAX_WIDTH / width_before)
img_after = img_before.resize((MAX_WIDTH, height_after))

文字を入れる

画像に文字を入れるには ImageDraw, ImageFont を使う。複数行の文字を入れる場合には multiline_text を使うと良い。

from PIL import Image, ImageDraw, ImageFont

bg_color = (0, 0, 0) # 背景色
im = Image.new('RGB', (width, height), bg_color)
draw = ImageDraw.Draw(im) # オブジェクトを作成
font_size = 24
font = ImageFont.truetype('ヒラギノ角ゴシック W7.ttc', font_size) # フォント
x = width // 2
y = height // 2
front_color = (255, 255, 255) 

draw.multiline_text(
	(x, y), # 描画位置
	"first sentence\nsecond sentence", # 入力する文字
	fill=front_color, # 文字色
	font=font, # フォント指定
	anchor='mm'
)
im.show()
タイトルとURLをコピーしました