見出し画像

[Python] 画像ファイルを指定サイズ以下まで縮小する

はじめに

Pythonで、指定フォルダ以下にある画像ファイルを指定サイズ以下まで縮小するツールを作成しました。

画像ファイルを縮小する方法はいろいろありますが、今回は、
①画像ファイルの幅を、指定ピクセルにリサイズ
②①でリサイズした画像ファイルのサイズが、指定サイズ以上なら、画質調整(quality)で指定サイズまで小さくし続ける

という処理を行っています。

使用するライブラリ

Pillow

画像処理ライブラリ。画像ファイルをリサイズ、画質調整するのに使用。

imghdr

画像ファイルの種類を判別するために使用。

os

OSに関連した機能を提供するライブラリ。ファイル、フォルダ操作や情報の取得に使用。

動作環境

・windows10
・Python 3.7.6

実装

# 画像ファイルのサイズを確認して、指定サイズより大きい場合は指定サイズまで削減する
# 引数:確認するファイルパス
# 戻り値:true : サイズ削減を実施 false: サイズ削減実施せず
def resize_img_file(file_path):
   is_resize = False
   
   # ファイルが画像ファイルかどうかを確認し、画像ファイルではない場合リサイズ処理は行わない
   img_type = imghdr.what(file_path)
   if img_type is None:
       return is_resize
   
   # ファイルサイズ確認
   if calc_kb(os.path.getsize(file_path)) >= MAX_FILE_SIZE:
       is_resize = True
       
       img = Image.open(file_path)
       width = MAX_WIDTH
       height = img.height * (MAX_WIDTH/img.width)
       resize = img.resize((int(width), int(height)))
       resize.save(file_path)
       
       # 画質のデフォルトは75
       quality = MAX_QUALITY
       
       while True:
           if calc_kb(int(os.path.getsize(file_path))) < MAX_FILE_SIZE:
               break
           img = Image.open(file_path)
           img.save(file_path,quality=quality,optimize=False)
           if quality >= 5:
               quality -= 10
           else:
               break
       
   return is_resize

# 指定フォルダ配下にある画像ファイルを処理
def recursive_resize_img_file(file_path):
   if os.path.isdir(file_path):
       files = os.listdir(file_path)
       for file in files:
           recursive_resize_img_file(os.path.join(file_path, file))
   else:
       resize_img_file(file_path)

recursive_resize_img_file(ROOT_PATH)

recursive_resize_img_file関数

引数のパスが、ディレクトリか、ファイルかを確認し、ディレクトリの場合、再帰で関数をコールしています。

resize_img_file関数

引数のファイルに対して、処理を行います。縮小処理を行ったかどうかを戻り値として、true/falseで返しています。

   img_type = imghdr.what(file_path)
   if img_type is None:
       return is_resize  

ファイルが画像ファイルかどうかを確認し、画像ファイル以外だったら、処理を終了しています。

       img = Image.open(file_path)
       width = MAX_WIDTH
       height = img.height * (MAX_WIDTH/img.width)
       resize = img.resize((int(width), int(height)))
       resize.save(file_path)

画像ファイルの幅を、指定ピクセルにリサイズとしているため、幅のリサイズした割合で高さの調整をしています。

           img.save(file_path,quality=quality,optimize=False)

saveメソッドのパラメータ、optionでは、品質の指定が可能です。初期値は、75となるので、10ずつ削減していき、ファイルサイズを減らしています。

実行結果

画像1

処理前です。2ファイルが、指定サイズ以上でした。

画像2

処理後です。
処理前の2ファイルが処理されたのを確認できました。

まとめ

Pythonで、指定フォルダ以下にある画像ファイルを指定サイズ以下まで縮小するツールをご紹介しました。
フォルダを指定すれば、その配下のディレクトリにある画像ファイルを一括で処理でき、指定したサイズやリサイズの方法もアレンジできるので、使い勝手良いかと思います。

この記事が気に入ったらサポートをしてみませんか?