この記事では、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は技術的な講座を動画で受けられるサービスです。
以上!
コメント