Skip to content
This repository has been archived by the owner on Jan 8, 2019. It is now read-only.

Latest commit

 

History

History
131 lines (88 loc) · 6.27 KB

3.rst

File metadata and controls

131 lines (88 loc) · 6.27 KB

3部 色々なスクリプトを作ってみよう

これまで1部、2部で学んだことを活かして色々な便利スクリプトを作ってみましょう。

  • 画像の一括変換
  • LGTM画像ジェネレーター
  • コラージュ壁紙ジェネレーター

画像の一括変換

2部の画像の縮小、JPEG変換スクリプトではファイルは1つだけしか変換できませんでした。 ディレクトリー(フォルダー)を指定して、その中の画像ファイルすべてを変換するスクリプトを作りましょう。

codes/3/resize_image.py を手元に写経して、 codes/3/resize ディレクトリーもコピーしてください。 写経できたら codes/3/ ディレクトリーに移動して python resize_image.py と実行してください。 resize/resized_alps.jpgresize/resized_sky.jpg と2つの画像ができます。

解説

基本的には2部で書いた画像の縮小スクリプトと同じです。 大きな違いは2点あります

  • os.listdir を使ってディレクトリー以下の画像を取得している
  • os.path.join を使って保存先の画像のパスを作っている

os.listdir の使い方は1部で学んだことと同じです。

LGTM画像ジェネレーター

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つ見ていきましょう。

  1. target_image_paths を作る
  • os.listdir を使って、コラージュ元画像のディレクトリー TARGET 内の画像へのパスを作っています。
  • ["./collage/alps.jpg", "./collage/sky.jpg"...] のようなリストになります
  1. 空の画像 collage_im を作る
  • 作りたいコラージュ画像のサイズで空の画像を作っています
  • 第一引数 'RGB' はモードの指定で、3色8ビットで色を表す指定をしています。 詳しくは モードの説明 を参照してください。
  1. マスごとにループ
  • 各マスの左上の位置を grid_xgrid_y で表しています
  • (grid_x, grid_y) の値は順に (0, 0), (0, 450), (800, 0) (800, 450) になります
  • range(0, 1600, 800)0 800 を順に返します
  • 「0から始まって、1600まで、800ずつ増やして返す」という意味です
  1. 先ほど作った target_image_paths から順に画像を読み込み
  2. コラージュの各マスのサイズに画像をリサイズ
  3. collage_im.paste(resized, ...) で画像を埋め込み
  • .paste() は画像と左上の位置を受け取ります。 resized(grid_x, grid_y) を渡しています
  1. 作ったコラージュ画像を保存

以上です。 処理としては複雑に見えますが、順に追って見ていけば理解できると思います。

チャレンジ 1

ループの処理をより見やすくしたバージョンを collage_2.py として用意してみました。 内容はけっこう難しいですがトライしてみましょう。写経してみて、やっていることを理解してみましょう

  • itertools.product は「組み合わせ」を作る関数です
  • zip は複数のリストを1つにまとめるものです。 zip([1, 2, 3], ["one", "two", "three"])[(1, "one"), (2, "two"), (3, "three")] になります。

チャレンジ 2

今の collage.py では画像の数がコラージュ中のマスの数より多くある必要があります。 画像が少ない場合は始めの1から繰り返すようにスクリプトを改良してみましょう。

画像の順番はこんなかんじです。

まとめ

すべて終われば 4部 に進まみしょう。 4部は今まで作ったスクリプトをコマンドとして完成させるオマケのテキストです。