画像ファイルを指定したファイルサイズまで自動で圧縮する
画像ファイルをメールに添付する場合など容量制限があるときに、手動でサイズ調整するのは面倒です。画像処理ライブラリOpenCVでjpen画像の縦横のピクセル数は元のまま、jpeg画像のファイルサイズ(容量)を指定したファイルサイズまで小さくします。OpenCVのcv2.imread()メソッドでjpeg画像を読み出し、cv2.imwrite()メソッドで画像を保存しますが、保存の際にcv2.IMWRITE_JPEG_QUALITYフラッグを用いてjpeg品質を指定します。保存したファイルの容量をチェックしあらかじめ指定したファイルサイズより大きければjpeg品質を下げてもう一度保存します。指定したファイルサイズより小さくなるまでこれを繰り返します。
使った関数・メソッド
- cv2.imread() : 画像ファイルの読み出し
- cv2.imwrite() : 画像の保存
- os.path.getsize() : ファイルサイズの取得
- cv2.IMWRITE_JPEG_QUALITY : imwriteのフラッグ。保存時のJpeg品質を指定する。引数のquality(品質)は0-100の範囲で指定。95がデフォルト。
関連記事
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'books.jpg'で保存しました。画像サイズ1600x1071px、ファイルサイズは600kBです。
コード
画像の縦横のピクセル数は元のまま、jpeg品質を1つづつ小さくして画像を保存し画像のサイズを取得します。取得したサイズが狙いのサイズ(ここでは100kB)より小さくなるまで繰り返します。
import cv2 import os filename = 'books.jpg' target = 100 # 狙いのサイズ100kB img = cv2.imread(filename) size = os.path.getsize(filename) quality = 95 while size > target*1000: cv2.imwrite('compression.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), quality]) size = os.path.getsize('compression.jpg') quality -= 1
実行結果
画像サイズは1600x1071pxのままで、97kBまで圧縮された画像が保存されます。この時のjpeg品質は11です。
以下のサイトを参考にさせていただきました
note.nkmk.me > Pythonでファイル、ディレクトリ(フォルダ)のサイズを取得