第2部では、より実用的なスクリプト開発に向けて、公開されたサードパーティのパッケージを使う方法を学びます。
画像処理ライブラリ Pillow を題材に、 実際にサードパーティのパッケージをインストールして、Python コードから利用してみましょう。
Note
サードパーティパッケージは、第三者が公開しているパッケージのことです。
パッケージ内には、コマンドラインツールや Pythonスクリプトから使えるモジュール郡などが含まれています。
このモジュールはライブラリと呼ばれます。
サードパーティパッケージは、
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のインストール方法はOSによって異なります。
Ubuntu: | get-pip.py |
---|---|
Windows/OSX: | 公式インストーラーにバンドル |
Note
$
の後にコマンドが続いている表記は、
ターミナル・コマンドプロンプトでコマンドを入力することを想定しています。
$ python my_script.py
Windows/OSX の場合、 Pythonをインストールした際にpipも一緒にインストールされており、 別途インストールする必要はありません。
Warning
ただし、Pythonの公式 (python.org) のインストーラ以外でインストールした場合はこの限りではありません。
Python公式のバイナリを使うことをオススメします。
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が正しくインストールされているかを確認しましょう。
以下のコマンドを実行してください。
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でいうフォルダーに相当するものです。
pipがインストールできたので、さっそくパッケージをインストールしてみましょう。
今回は、Pillowという画像処理用のライブラリをインストールします。
Pillowは画像処理を行うライブラリで、画像の縮小や切り取りをはじめ、 様々な画像編集を行うことができます。
pipでパッケージをインストールするには pip install
コマンドを使います。
以下のコマンドを実行してPillowをインストールしてください。
$ pip install Pillow
インストールされているパッケージを確認するには、 pip freeze
コマンドを実行します
$ pip freeze Pillow==3.3.1
==
の左側がインストールしたパッケージ名、右側がパッケージのバージョンです。
Pillow が無事インストールされていれば、上記のような表示が得られます。
Note
インストールしたタイミングによってはバージョンが異なる場合がありますが問題ありません。
Note
インストールしたパッケージを削除するには、 pip uninstall パッケージ名
というコマンド使います。
例えば、 Pillow を削除するには pip uninstall Pillow
とします。
スクリプトを作成する前に、必要なファイルを自分の手元にコピーしましょう。
第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
には 291
が height
には 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部 ではこれらを踏まえて、より実用的なスクリプトの作成方法について学びます。