これまで1部、2部で学んだことを活かして色々な便利スクリプトを作ってみましょう。
- 画像の一括変換
- LGTM画像ジェネレーター
- コラージュ壁紙ジェネレーター
2部の画像の縮小、JPEG変換スクリプトではファイルは1つだけしか変換できませんでした。 ディレクトリー(フォルダー)を指定して、その中の画像ファイルすべてを変換するスクリプトを作りましょう。
codes/3/resize_image.py を手元に写経して、 codes/3/resize
ディレクトリーもコピーしてください。
写経できたら codes/3/
ディレクトリーに移動して python resize_image.py
と実行してください。
resize/resized_alps.jpg
、 resize/resized_sky.jpg
と2つの画像ができます。
基本的には2部で書いた画像の縮小スクリプトと同じです。 大きな違いは2点あります
os.listdir
を使ってディレクトリー以下の画像を取得しているos.path.join
を使って保存先の画像のパスを作っている
os.listdir
の使い方は1部で学んだことと同じです。
LGTMはLooks Good To Meの略で、コードレビューの際に「良いね!」「(リリースしても)大丈夫そう」という意味で使うスラングです。 単に文字で「LGTM」とコメントするのは少しツマラナイので、それっぽい(例えばサムズアップしてる)画像に「LGTM」と文字を挿入して画像で返信しましょう。
codes/3/lgtm.py を手元に写経してください。
写経できたら codes/3
ディレクトリーに移動して python lgtm.py
と実行してください。
WindowsやLinuxの方は ImageFont.truetype('Helvetica', ...
のフォント指定を好きなフォントに変えてください。
- Windows: arial
Pillow
で何か2次元上の絵を書く場合は ImageDraw を使います。
今回は文字を書きたかったので Draw.text
を使っています。
公式ドキュメントの例 も参考になります。
ImageDraw
を使えば他にも線を引いたり四角を書いたりできます。
詳しくは ImageDrawの公式ドキュメント を参考にしてください。
画像をいくつか合成してコラージュ画像を作ってみましょう。 例えばお気に入りの旅行の写真を4枚用意して、2 x 2 にマス目状に並べて壁紙にするようなスクリプトです。
codes/3/collage.py を手元に写経してください。
写経できたら codes/3
ディレクトリーに移動して python collage.py
と実行してください。
Note
このスクリプトは数十個の素材画像やアイコン画像を1つの画像にまとめておくのにも使えます。 ゲーム、Web開発中にも使えます。
少しスクリプトは複雑なので、1つ1つ見ていきましょう。
target_image_paths
を作る
os.listdir
を使って、コラージュ元画像のディレクトリーTARGET
内の画像へのパスを作っています。["./collage/alps.jpg", "./collage/sky.jpg"...]
のようなリストになります
- 空の画像
collage_im
を作る
- 作りたいコラージュ画像のサイズで空の画像を作っています
- 第一引数
'RGB'
はモードの指定で、3色8ビットで色を表す指定をしています。 詳しくは モードの説明 を参照してください。
- マスごとにループ
- 各マスの左上の位置を
grid_x
とgrid_y
で表しています(grid_x, grid_y)
の値は順に (0, 0), (0, 450), (800, 0) (800, 450) になりますrange(0, 1600, 800)
は0
800
を順に返します- 「0から始まって、1600まで、800ずつ増やして返す」という意味です
- 先ほど作った
target_image_paths
から順に画像を読み込み - コラージュの各マスのサイズに画像をリサイズ
collage_im.paste(resized, ...)
で画像を埋め込み
.paste()
は画像と左上の位置を受け取ります。resized
と(grid_x, grid_y)
を渡しています
- 作ったコラージュ画像を保存
以上です。 処理としては複雑に見えますが、順に追って見ていけば理解できると思います。
ループの処理をより見やすくしたバージョンを collage_2.py
として用意してみました。
内容はけっこう難しいですがトライしてみましょう。写経してみて、やっていることを理解してみましょう
- itertools.product は「組み合わせ」を作る関数です
- zip は複数のリストを1つにまとめるものです。
zip([1, 2, 3], ["one", "two", "three"])
は[(1, "one"), (2, "two"), (3, "three")]
になります。
今の collage.py
では画像の数がコラージュ中のマスの数より多くある必要があります。
画像が少ない場合は始めの1から繰り返すようにスクリプトを改良してみましょう。
画像の順番はこんなかんじです。
すべて終われば 4部 に進まみしょう。 4部は今まで作ったスクリプトをコマンドとして完成させるオマケのテキストです。