masalibの日記

システム開発、運用と猫の写真ブログです

【python3】pythonのPillowで画像の圧縮

pythonにはPillow(Python Imaging Library)という超便利な画像ライブラリがあります。 そちらをつかって画像の圧縮をします

仕様

動き

  1. urlから画像をダウンロードしてimgという変数に突っ込む
  2. ダウンロードした画像の縦横のピクセルを取得する
  3. 変換した画像サイズのピクセル数を計算する
  4. 画像圧縮する
  5. 変換画像を保存する

ソース

https://colab.research.google.com/drive/13a3OJe63lZdpzmAIcdPB8jcMLdPKHwCH

import IPython
from io import StringIO
import io
import urllib.request
from PIL import Image

# urlから画像をダウンロードしてimgという変数に突っ込む
imagesrc ="http://cdn-ak.f.st-hatena.com/images/fotolife/m/masalib/20160218/20160218144707.jpg"
f = io.BytesIO(urllib.request.urlopen(imagesrc).read())
img = Image.open(f)

# ダウンロードした画像の縦横のピクセルを取得する
img.save('sorce.jpg')
before_x, before_y = img.size[0], img.size[1]

# 変換した画像サイズのピクセル数を計算する
# 縦基軸の場合
height = 360
x = int(round(float(height / float(before_y) * float(before_x))))
y = height

# 横基軸の場合
#width = 480
#x = width
#y = int(round(float(width / float(before_x) * float(before_y))))

# 画像圧縮する
img = img.resize((x,y), Image.LANCZOS)

# 変換画像を保存する
img.save('resized.jpg')

# 比較
print ("もと画像の縦横",before_x, before_y)
IPython.display.Image('sorce.jpg')

print ("変換後画像の縦横",x, y)
IPython.display.Image('resized.jpg')

結果

f:id:masalib:20190326234432j:plain
変換画面

感想

  • 変数にわたさないと変換されない??という罠にはまった
img = img.resize((x,y), Image.LANCZOS)
img.save('resized.jpg')
  • 縦横のサイズを計算するのがめんどくさい。パラメータであればいいけど、見当たらなかった
  • resizeのフィルタがあるが実行速度や圧縮の関係がまだ理解していないので検証したい