はじめに

Pythonで画像を作りたい際に便利に使えるのがPillowです。

需要があるのか知りませんが、そのPillowの機能を利用してOpenTypeフィーチャーを設定し、綺麗に文字を組んでみましょう!

Pillowとは

PIL(Python Imaging Library)のフォークです。

Pythonで画像を扱う際に使われます。Pythonで画像を扱うときに僕はだいたいOpenCVかこのPillowを使います。

OpenTypeフィーチャーとは

わかりやすいところでいうとカーニングやリガチャ(今回試すのもこの2つです)です。カーニングは文字と文字の間隔のことで、それを自動で調整してくれる機能があります。リガチャは特定の文字が続く際に字の形を変える機能です。

どちらも、後で出てくる実際の出力画像を見ればわかると思います。

前準備

PillowでOpenTypeフィーチャーを利用するには、libraqmというライブラリをあらかじめインストールしておかなければなりません。

ここではmacOSを例にインストール方法を説明します。ほかのOSの方はこちらのリポジトリを参考に進めてください。

依存ライブラリのインストール

brewを利用しインストールするので、入れてない人は入れましょう。

$ brew install freetype harfbuzz fribidi gtk-doc

libraqmのインストール

まずlibraqmのリポジトリのリリースページから最新版をダウンロードし、解凍します。
libraqmのインストール
ターミナルで、そのディレクトリに移動しましょう。そこで以下のコマンドを実行します。

$ ./configure
$ make
$ make install

これでインストールが完了です。PillowでOpenTypeフィーチャーが使えるようになります。

では使い方を見ていきましょう!

実際に使ってみる

実際のコードがこちらになります。

from PIL import Image, ImageDraw, ImageFont

# 白いキャンバスを用意
image = Image.new('L', (1200, 630), 255)
# 描画用意
draw = ImageDraw.Draw(image)

# TrueType/OpenTypeフォントの読み込み
truetype_font = ImageFont.truetype('mplus-1p-regular.ttf', size=200)
# フォントのセット
draw.font = truetype_font
# テキスト描画(OpenTypeフィーチャーを有効)
draw.text((0, 0), 'fi, AW, ON', fill=0, features=['liga', 'kern'])
# テキスト描画(OpenTypeフィーチャーを無効: マイナスを先頭に入れる)
draw.text((0, 300), 'fi, AW, OFF', fill=0, features=['-liga', '-kern'])

# 画像の保存
image.save('out.png')

このコードで保存される画像がこちらになります。
PillowでOpenTypeフィーチャー
綺麗に出力されましたね!

ImageDraw.text()においてfeaturesを設定することで、利用するOpenTypeフィーチャーを指定できます。また、ここで指定する文字列はOpenTypeの仕様書にあるリストから選択します。

他にも色々なものを試してみましょう。

おわりに

かなりマニアックな内容でしたが僕は何かと文字画像を作る機会が多いので、おさらいまでにまとめてみました。

これからも文字に関する記事が増えると思いますが、お付き合いください。