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

Latest commit

 

History

History
429 lines (258 loc) · 14.7 KB

2.rst

File metadata and controls

429 lines (258 loc) · 14.7 KB

第2部 基本的なPillowの使い方

第2部では、より実用的なスクリプト開発に向けて、公開されたサードパーティのパッケージを使う方法を学びます。

画像処理ライブラリ Pillow を題材に、 実際にサードパーティのパッケージをインストールして、Python コードから利用してみましょう。

Note

サードパーティパッケージは、第三者が公開しているパッケージのことです。

パッケージ内には、コマンドラインツールや Pythonスクリプトから使えるモジュール郡などが含まれています。

このモジュールはライブラリと呼ばれます。

pipを使ってみよう

サードパーティパッケージは、 pip というコマンドを用いて自分の環境にインストールことができます。 これは、PHPの composer コマンドやJavaScriptの npm コマンドに相当します。

pipでインストールできるサードパーティのパッケージは、 Python Package Index (PyPI: https://pypi.python.org/pypi) に登録されています。

PyPIには、DjangoやFlaskといったWeb開発のためのフレームワークをはじめ、 numpyなどの数値計算ライブラリやプロビジョニングツールのAnsibleなど、 様々なパッケージが登録されており、pipで簡単にインストールすることができます。

これらのパッケージは、画像編集スクリプトといった、実用的なスクリプト開発の助けになり、 また、ライセンス次第ですが、多くのパッケージは無料で使うことができます。

もちろんこれから使うPillowもPyPIに登録されているのでpipでインストールすることができます。

pipのインストール

pipのインストール方法はOSによって異なります。

Ubuntu:get-pip.py
Windows/OSX:公式インストーラーにバンドル

Note

$ の後にコマンドが続いている表記は、 ターミナル・コマンドプロンプトでコマンドを入力することを想定しています。

$ python my_script.py

Windows/OSX

Windows/OSX の場合、 Pythonをインストールした際にpipも一緒にインストールされており、 別途インストールする必要はありません。

Warning

ただし、Pythonの公式 (python.org) のインストーラ以外でインストールした場合はこの限りではありません。

Python公式のバイナリを使うことをオススメします。

Ubuntu

Ubuntuにpipをインストールするには、PyPIが配布している get-pip.py というインストールスクリプトを用います。

以下のコマンドでpipをインストールします。

$ curl https://bootstrap.pypa.io/get-pip.py | sudo python3

Caution!

python コマンドではなく python3 コマンドを使うことに注意してください。 python コマンドを使うと、 Python 2 用に pip がインストールされてしまいます。

Ubuntu では、今後も引き続き python コマンドではなく python3 コマンドを用います

Note

curl コマンドがインストールされていない場合は、 sudo apt-get install -y curl でインストールできます。

このままだとpipでパッケージインストール時にroot権限が必要となるので、 ホームディレクトリ下のパッケージインストール用ディレクトリにインストールされるように設定します。

$ mkdir -p ~/.config/pip/
$ echo -e '[install]\nuser = yes' > ~/.config/pip/pip.conf

これでインストールは完了です。

pipのバージョン確認

次に、pipが正しくインストールされているかを確認しましょう。

以下のコマンドを実行してください。

Ubuntu/Windows:

$ pip --version
pip 8.1.2 from /usr/local/lib/python3.4/dist-packages (python 3.4)

OS X(3.4):

$ pip3.4 --version
pip 8.1.2 from /path/to/dist-packages (python 3.4)

OS X(3.5):

$ pip3.5 --version
pip 8.1.2 from /path/to/dist-packages (python 3.5)

この出力はそれぞれ次のような意味です。

  • pip 8.1.2 pip のバージョン
  • from /usr/local/lib/python3.4/dist-packages pipでインストールされたパッケージが配置されるディレクトリ
  • (python 3.4) pip が動いてるPythonのバージョン

この出力から以下のことが確認できれば、無事にpipがインストールできています

  • pip のバージョンが 8 以上 (8.0.0, 8.1.2 など)
  • Python のバージョンが 3.4 または 3.5

Note

Windows の方へ: ディレクトリとはWindowsでいうフォルダーに相当するものです。

Pillowをインストールしよう

pipがインストールできたので、さっそくパッケージをインストールしてみましょう。

今回は、Pillowという画像処理用のライブラリをインストールします。

Pillowは画像処理を行うライブラリで、画像の縮小や切り取りをはじめ、 様々な画像編集を行うことができます。

recursive.png

作例 1: PyCon JP 2016 のロゴを繰り返し配置する

rotate.png

作例 2: PyCon JP 2016 のロゴを回転させる

pipでパッケージをインストールするには pip install コマンドを使います。

以下のコマンドを実行してPillowをインストールしてください。

$ pip install Pillow

インストールされているパッケージを確認するには、 pip freeze コマンドを実行します

$ pip freeze
Pillow==3.3.1

== の左側がインストールしたパッケージ名、右側がパッケージのバージョンです。 Pillow が無事インストールされていれば、上記のような表示が得られます。

Note

インストールしたタイミングによってはバージョンが異なる場合がありますが問題ありません。

Note

インストールしたパッケージを削除するには、 pip uninstall パッケージ名 というコマンド使います。 例えば、 Pillow を削除するには pip uninstall Pillow とします。

参考: https://pip.pypa.io/en/stable/user_guide/

準備

スクリプトを作成する前に、必要なファイルを自分の手元にコピーしましょう。

第2部で必要なファイルは、 codes/2/ ディレクトリに収められています。 これを自分が実際に作業できるディレクトリへコピーしてください。

第2部での作業は、このコピー先のディレクトリ内で行います。

画像を読み込んでみよう

Pillowで画像を読み込んで、画像のサイズを表示するスクリプトを書いてみましょう。

Pillowで画像を読み込むには、 PIL.Image モジュールの open() 関数を用います。

また、 画像のサイズは、 open() 関数が返すImageオブジェクトの size 属性から、 (width, height) というint型のタプル形式で取得できます。

# read_image.py

from PIL import Image


with Image.open('./2016.png', 'r') as im:
    print('%dx%d' % im.size)

Note

ここでの「オブジェクト」は、 コンピューター上に存在する「データ」と「データの使い方」をまとめた「モノ」と考えてください。

例えば、 Image オブジェクトは、 サイズ (size) や色などいった値(属性)から構成される「データ」と 「データ」である画像のサイズを変更する (resize()) といった「データの使い方」がまとまっています。

「オブジェクト」についてより詳しく知りたい方は、 ジェラルド・ジェイ・サスマンほか(2014)『計算機プログラムの構造と解釈 第2版』翔泳社の2章を参照してください。

Note

「int型」とは、データの「型」のひとつです。 「型」は、同じ性質のデータをグループ化するものです。

例えば、「int型」は「整数」を、「str型」は「文字列」を表します。

Note

「タプル」とは、いくつかの「データ」を並べた「データ」です。

Pythonでは、 (123, 'abcdedfg', None) といったように , 区切りの並び(シーケンス)を () で囲うことで作り出すことができます。

また、リストとはことなり、既存のタプルに要素を追加することはできません。 (ただし、タプルとタプルをつなげて新しいタプルを作ることはできます。)

タプルは、各要素が特定の役割を持っていることが多く、 たとえば、 Image オブジェクトの size 属性は、 1番目が幅で2番目が高さという役割を担っています。

「タプル」についてより詳しく知りたい方は、 Pythonの公式ドキュメント http://docs.python.jp/3.5/tutorial/datastructures.html#tuples-and-sequences や Miran Lipovaca (2012) 『すごいHaskellたのしく学ぼう!』オーム社を参照してください。

配布した画像ファイル 2016.png と同じディレクトリに、 read_image.py という名前で上記のファイルを作成してください。

Note

PIL(Python Imaging Library)はPillowの分岐(フォーク)元のライブラリです。 PILは長らく開発が停滞しており、PillowはPILをフォークし開発を後継しています。

すると下記のようなディレクトリ構成になります。

./
+- 2016.png
+- read_image.py

では、このスクリプトを実行してみましょう。

$ python read_image.py
291x218

スクリプトを実行すると上記のように画像ファイルのサイズが出力されます。

画像を保存してみよう

では開いたファイルを保存してみましょう。

画像を保存するには、 Image オブジェクトの save() メソッドを使います。

Note

「メソッド」は、「データ」に紐付いた「データの使い方」と考えてください。

save() メソッドの引数は次のようになっています。

第1引数:保存先のパス。 path/to/image.png など
第2引数:画像フォーマット (省略すると第一引数の拡張子から推測したフォーマットが選ばれます)

今回は開いた PNG ファイルを JPEG 形式で保存してみます。

write_image.py という名前で以下のファイルを作成してください。

# write_image.py

from PIL import Image


with Image.open('./2016.png', 'r') as im:
    im.save('./2016.jpg', 'JPEG')
$ python write_image.py
$

これで画像が書き出されているはずです

Linux/OSXでは ls コマンドを、 Windowsでは dir コマンドを使って確認してみましょう。

Linux/OSX:

$ ls
read_image.py write_image.py  2016.jpg  2016.png

Windows:

$ dir /B
read_image.py
write_image.py
2016.jpg
2016.png

出力が確認できたらEye of GnomeやWindows フォトビューアを使って 2016.jpg を開いてみてください。

画像を縮小してみよう

最後に画像を縮小してみましょう。

resize_image.py という名前で以下のファイルを作成してください。

# resize_image.py
from PIL import Image


RATIO = 0.5
#: 縮小比率

with Image.open('./2016.png', 'r') as im:
    # 画像サイズを取得
    width, height = im.size

    # ``RATIO`` で縮小する
    resized = im.resize((
        int(RATIO * width),
        int(RATIO * height),
    ))

    # 縮小された画像 (``resized``) を保存する
    resized.save('./resized-2016.png')

ここで width, height = im.size というコードが出てきました。

左辺に変数が2つありますが、ここでは何が起きるのでしょうか。

今、 im.size には、 (291, 218) というintのタプルが入っており、 このコードを実行すると、 width には 291height には 218 が代入されます。

Pythonではタプルやリスト(シーケンス)の中身を、 複数の変数へ同時に代入(アンパック)することができます。

つまり次のコードと等価です。

# 以下の2行は ``width, height = im.size`` と等価
width = im.size[0]  # 291
height = im.size[1]  # 218

このようにシーケンスの中身を複数の変数へ代入する操作を 「シーケンス・アンパッキング」と呼びます。

Note

左辺の変数の数と右辺のシーケンスの長さが一致している必要なことに注意してください。 例えば、次のようなことは できません

x, xs = [1, 2, 3, 4]

さて、画像を縮小するには、 Image オブジェクトの resize() メソッドを使います。

resize(size) メソッドは、 縮小後のサイズを (width, height) という int のタプル形式で渡すと、 画像が縮小された Image オブジェクト新しく作って返します。

Note

resize() メソッドを呼び出されたオブジェクトの画像サイズは変わりません

最後に、縮小後の Image オブジェクトの save() メソッドを呼び出して保存します。

コードが書けたらさっそく実行してみましょう。

$ python resize_image.py
$

縮小に成功していると、 resized-2016.png という名前で縮小された画像が出力されているので、 無事縮小された画像が出力されていることを確認してみましょう。


第2部では次のことを学びました。

  • [ ] pipのインストール
  • [ ] pipによるサードパーティパッケージのインストール
  • [ ] サードパーティパッケージ (Pillow) をPythonスクリプトから利用する方法

3部 ではこれらを踏まえて、より実用的なスクリプトの作成方法について学びます。