PythonとPillowを使って、特定のディレクトリ配下の大量の写真をまとめてリサイズする

デジカメで撮った写真をブログ等に投稿するにあたって、避けられない(した方がいい)けれど面倒くさい作業に、画像のリサイズがあります。

デジカメの写真は概して容量が大きく、そのままアップロードしてしまうと、読み込み速度を低下させたり、サーバーのアップロード可容量を圧迫してしまいます。

じぶんはこれまでwindowsのpaintツールを使って一枚一枚ちまちまリサイズしていたのですが、これが面倒くさい。

Pythonで数行スクリプトを書くと、あっという間に自動で処理してくれましたので、記録しておこうと思います。

 

スクリプト

 

メモ書き

・リサイズしたい写真のファイルパスを取得するには、glob.glob(パス)を用いる。

import globして、上記スクリプトでは、Picturesファルダ以下のAlbumフォルダ以下のすべてのjpgファイルを取得するようになっている。

*がすべて、という意味を表す。

パスのバックスラッシュ(\)はエスケープを入れないと正規表現とみなされてしまうため、\\とする。

globで得られるのは、albumフォルダ内の「ファイル名」ではなく、「ファイルパス」。

 

・リサイズした画像を保存する場所を新たに作るには、import osして、os.mkdir(パス)を用いる。

上記スクリプトでは、Picturesフォルダ内に、新たにresizeフォルダを作成している。パスの最後に新たに作成したいフォルダ名を記述する。

 

・imgListにはそれぞれの画像のパスが入っているので、forループで中身を1枚1枚取り出す。

保存するときに、リサイズ画像の名前をつけるときのために、enumerateでindexも取得しておくと便利。

保存は”file{}”.format(n+1)としておくと、1枚目の写真には”file1″2枚目の写真には”file2″といった名前を付けて保存してくれる。

 

※サイズは、もとの写真が何対何の縦横比であるのか調べておく。もとの写真が4:3なのに、16:9でリサイズしてしまうと残念なことになる。

 

・リサイズ処理の流れは

Image.open(パス)で画像を指定する → img.resize((サイズ))でリサイズする。

img.resize()の引数には、サイズのほかにフィルタ(LANCZOS等)を指定できる。

高品質∧低速 ⇔ 低品質∧高速 をフィルタで選べる。

詳細はこちら

(とはいえフィルタは設定しなくてもリサイズできる。)