Pythonで画像のアス比を保ち縦横の長い方で縮小したよ
ども、この前はJpegファイルの見た目を変えず、容量を削減するという記事を書きましたが、今回は別のアプローチとして画像の大きさを小さくすることで容量を削減します。
というわけで、今回はPythonの画像ライブラリであるPIL(Pillow)を使って画像の縮小方法を備忘録的にまとめます。ただ、単純に縮小するだけではつまらないので画像の縦横で長い方を基準に、あらかじめ決めておいたサイズに縮小するということをやっていきます。
OS : CentOS
Python : Python3.6
Contents
1. thumbnail関数
さて、今回使うのは、PILに含まれているthumbnailという関数です。正直この関数を使うだけで、ほぼ今回の目標を達成してしまうのですが・・・それは気にしないでやっていきます。
まずは、PILのライブラリをインストールしなくてはいけません。いつも通り、インストールはpipコマンドが使えます。
1 |
$ sudo pip install pillow |
インストールができたら、以下のコードを実行してみてください。コード内の”Image.open”の引数はリサイズを行う画像へのパスを記述してください。
1 2 3 4 5 6 |
#coding:utf-8 from PIL import Image img = Image.open('ここに画像へのパス') img.thumbnail((100, 100), Image.ANTIALIAS) img.save('resized.jpg') |
簡単なコードですが、これだけで画像のアス比を保ちつつ長辺を100pxにリサイズすることができます。つまりは関数の名前通りサムネイルを作成するための関数なんでしょうかね?
2. もう少し工夫
さて、先ほどのコードではお粗末なので、もう少しだけ何か書こうと思います。今回は、容量削減を目的にやっているので、小さいファイルを大きくするつもりはありません。そこで、読み込んだ画像ファイルの大きさを見てすでに小さい場合はリサイズを行わないようにします。ついでに、関数化とかしておこうと思います。というわけで、完成品が以下のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#coding:utf-8 from PIL import Image def _resize(image_path, THUMBNAIL_WIDTH = 1024, THUMBNAIL_HEIGHT = 1000): try: img = Image.open(image_path) except OSError: return False w, h = img.size if w < THUMBNAIL_WIDTH and h < THUMBNAIL_HEIGHT: return True img.thumbnail((THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT), Image.ANTIALIAS) img.save(image_path) return True |
一応関数化してみました。リサイズする大きさは関数のデフォルト引数として与えられているので、リサイズ後の大きさを変えたければ、実行時に引数を渡してあげるか、デフォルト引数を書き換えれば大丈夫です。
コーディングで分からないことがあれば
プログラミングや環境構築で分からないことがあったら『teratail』というエンジニア特化型のQ&Aサービスがオススメです。自分もどうしても分からないことがあったら、時々質問しにいきますが、かなりニッチな質問にも意外と早く回答がつくのでとても頼もしいです。という宣伝でした。
おわりに
さて、今回は前の記事の延長話ということで、画像の縮小をやってきました。実際にやってみると単純ですが、効果は絶大なのでやる価値はあると思います。