Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

画像ファイルを指定したファイルサイズまで自動で圧縮する

 画像ファイルをメールに添付する場合など容量制限があるときに、手動でサイズ調整するのは面倒です。画像処理ライブラリ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がデフォルト。
関連記事

Jpeg画像のファイルサイズを小さくする

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.8.8
  • OpenCV 4.0.1
準備

 画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'books.jpg'で保存しました。画像サイズ1600x1071px、ファイルサイズは600kBです。
f:id:T_A_T:20220127204052j:plain

コード

 画像の縦横のピクセル数は元のまま、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です。
f:id:T_A_T:20220127204226j:plain

以下のサイトを参考にさせていただきました

note.nkmk.me > Pythonでファイル、ディレクトリ(フォルダ)のサイズを取得

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村