「それ、pythonでできるよ」-画像のリサイズ-

今シリーズは簡単なことはpythonでやってしまおう!!という精神の記事です。

今回は「python画像編集」シリーズその3

画像編集の基本である「リサイズ」をやってみます!!

Pillow

Pillowを使っていきます。

この辺りは準備完了!という方は飛ばしてもらってもかまいません。

PillowとはPIL(Python Imaging Library)という画像ライブラリの後継です。

PILは開発が停止されましたが、Pillowは現在も開発が進められています。

インストール

まずPillowをインストールします。

pip install pillow

PillowとPILは共存出来ません。

両方インストールしてしまった場合は、まず両方ともアンインストールしてから片方だけをインストールしましょう。

画像のリサイズ

画像のリサイズにはresize((width,height),resample)関数を使います。

リサイズ後のサイズをwidth,heightで指定します。

今回使用する画像はこちらです。

サンプル画像

まずは、一番簡単なリサイズから行ってみます。

from PIL import Image
img_1 = Image.open('man.jpg')#画像の読み込み
img_1_resize = img_1.resize(size=(252,252), resample=Image.NEAREST)#リサイズ処理
img_1_resize = img_1_resize.save('img_resized.jpg', quality=95)#保存

リサイズ画像1

正方形サイズ(252×252)にリサイズしたのでつぶれた画像になっています。

引数resampleはリサイズ時のフィルターの指定ですが、基本的にはデフォルトのNEARESTでいいと思います。

高品質にリサイズしたいなら、Image.LANCZOSなどと指定すればいいですが処理時間は長くなります。

アスペクト比を維持したままリサイズ

先ほどのリサイズは縦横比が崩れてしまうのであまり、正方形画像でしか使いにくと思います。

画像の縦横比はそのままで、小さくしたい場合について紹介します。

以下のような関数で実現しています。

def scale_to_width(img, width):  # アスペクト比を固定して、幅が指定した値になるようリサイズする。
    height = round(img.height * width / img.width)
    return img.resize((width, height))

横幅を指定して、縦横比を保ったままリサイズしています。

第一引数(img)に対象の画像、第二引数にサイズを指定します。

後はこの関数を呼び出すだけです。

img_1_resize = scale_to_width(img_1, 250)
img_1_resize = img_1_resize.save('img_resized.jpg', quality=95)

結果は各自の画像のプロパティで確認してもらうといいと思います。

画像の一括リサイズ

フォルダ内の画像を全て一括で処理する方法を説明します。

glob関数でファイルのパスを取得し、それぞれに対して読み込み・リサイズ・保存するだけです。

特定の拡張子ファイルを一括処理

まずは必要なモジュールをインポートします(ない場合はインストール)

import os
import glob

画像が入っているフォルダからパス一覧を取得します。

files = glob.glob('./data/images/*.jpg')

最後の*.jpgで「~.jpg」に当てはまるファイルの全てのパスが取得できます。

後はfilesに対してfor文で一つずつ処理していきます。

for f in files:
    img = Image.open(f)
    img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
    title, ext = os.path.splitext(f)#パスからファイル名を取得
    img_resize.save(title + '_half' + ext)

今回は画像のサイズを半分(img.width/2,img.height/2)にリサイズしています。

今更ですが、サイズの指定は整数のみなのでint()でキャストしています。

全ての画像を一括処理

jpgやpng、他のファイルが混在している場合パスを全て取得してからtry…except…で可能なファイルのみ処理していきます。

files = glob.glob('./data/temp/images/*')#全てのファイルのパスを取得

for f in files:
    try:#ファイルがPillowの読み込みに対応しているとき
        img = Image.open(f)
        img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
        title, ext = os.path.splitext(f)
        img_resize.save(title + '_half' + ext)
    except OSError as e:
        pass

これでどんなフォルダでも対応できます。

例えば、写真の数が多くなりすぎて容量を減らしたい時、一括でリサイズ(縮小)してあげれば良いかもしれません。

以上でpythonで画像のリサイズを実装していきました。

Sponsored Link

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です