PythonでJPEG形式とPNG形式の画像を圧縮する

ノウハウ
スポンサーリンク

この記事では、Pythonの「pillow」というライブラリを使って、JPEG形式とPNG形式の画像を圧縮する方法を紹介します。

なお、私の環境は以下です。

  • Python: 3.8
  • PIL(pillow): 7.1.2

 

目次

 


 

Pythonで画像ファイルを編集するには?

Pythonで画像編集するライブラリは幾つかありますが、本記事では「pillow」というライブラリを使うことにします。

Pillow
Pillow is the friendly PIL fork by Jeffrey A. Clark and contributors. PIL is the Python Imaging Library by Fredrik Lundh...

# 「pillow」はOpenCVよりも軽量でシンプルなライブラリのようです。

 

インストールするには、以下のコマンドを実行します。

$ pip install Pillow

 

サンプルコード

この記事の題名の通り、サンプルコードとしてPNGとJPEGフォーマットを圧縮する処理を紹介します。

※注意:画像ファイルはWebでのアップロードファイルを想定しており、オンメモリのバイトストリームであることを前提としています。

 

なお、事前準備として、ファイルとしては、「jpeg_image.jpg」と「png_image.png」というJPEG形式とPNG形式の画像ファイルを用意しています。

 

【サンプルコード】

from PIL import Image
from io import BytesIO
import os

# コンフィグ
COMPRESS_QUALITY = 30 # 圧縮のクオリティ

# JPEG形式とPNG形式の画像ファイルを用意
jpeg_imgefile = 'jpeg_image.jpg'
png_imgfile = 'png_image.png'

#############################
#     JPEG形式の圧縮処理     #
#############################
# ファイル名を取得
file_name = os.path.splitext(os.path.basename(jpeg_imgefile))[0]
with open(jpeg_imgefile, 'rb') as inputfile:
    # バイナリモードファイルをPILイメージで取得
    im = Image.open(inputfile)
    # JPEG形式の圧縮を実行
    im_io = BytesIO()
    im.save(im_io, 'JPEG', quality = COMPRESS_QUALITY)
with open('comp_' + file_name + '.jpg', mode='wb') as outputfile:
    # 出力ファイル(comp_png_image.png)に書き込み
    outputfile.write(im_io.getvalue())

#############################
#     PNG形式の圧縮処理      #
#############################
# ファイル名を取得
file_name = os.path.splitext(os.path.basename(png_imgfile))[0]
with open(png_imgfile, 'rb') as inputfile:
    # バイナリモードファイルをPILイメージで取得
    im = Image.open(inputfile)
    # JPEG形式に変換して、圧縮を実行
    im = im.convert('RGB')
    im_io = BytesIO()
    im.save(im_io, 'JPEG', quality = COMPRESS_QUALITY)
with open('comp_' + file_name + '.jpg', mode='wb') as outputfile:
    # 出力ファイル(comp_png_image.png)に書き込み
    outputfile.write(im_io.getvalue())
  • COMPRESS_QUALITYは圧縮品質を決めているパラメータで、小さいほど圧縮を行います。
  • PNG形式は、PILのsaveで圧縮できなかったので、jpegに変換しています。

 

実行結果

ファイルのサイズは以下のように変化しました。

  • jpeg_image.jpg(911KB) ⇒ comp_jpeg_image.jpg(208KB)  :77%圧縮
  • png_image.png(144KB) ⇒ comp_png_image.jpg(28KB) :81%圧縮

 

関連情報

自分は、PythonをConoHa VPS上に構築しています。構築方法や挑戦したことなどを以下のブログにまとめたので、よろしければご覧になってください。

 

参考

 

広告

Pythonを勉強するなら、Udemyの「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」がオススメです!
※Udemyは技術的な講座を動画で受けられるサービスです。

 

以上!

コメント

タイトルとURLをコピーしました