1. ホーム
  2. スクリプト・コラム
  3. パイソン

Python Pillow Image.save jpg画像圧縮問題

2022-01-08 05:31:26

ピロー画像フォーマット変換

Pillowライブラリは様々な画像フォーマットに対応しているので、画像の種類に関係なくopen()メソッドで直接画像を読み込むことができますし、Pillowでは画像フォーマット間の変換も簡単に行うことができます。

画像フォーマット間の変換には、主に2つの方法があり、それぞれについて以下に説明します。

save()

save()メソッドは、その名の通り画像を保存するためのもので、ファイル形式が指定されていない場合はデフォルトの画像形式で、画像形式が指定されている場合は指定された形式で保存されます。 save()は、以下の構文形式を持っています。

Image.save(fp, format=None)

パラメータは以下のように記述されています。

  • fp: 画像の保存パスで、画像名を文字列形式で含む。
  • format: オプションのパラメータで、画像の形式を指定します。

例としては、以下のようなものがあります。

from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
im.save('C:/Users/Administrator/Desktop/c.biancheng.net.bmp')

この時点で、パソコンのデスクトップ上にc.bianchneg.net.BMP形式の画像が存在することになります。

convert()+save()

すべての画像形式がsave()メソッドで変換できるわけではないことに注意してください。例えば、PNG画像をJPGとして保存する場合、save()メソッドを直接使用すると、以下のエラーが発生します。

from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
im.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')

エラーメッセージは以下のとおりです。

#システムエラー、JPEG画像のモードとしてRGBAを使用できません。

OSError: モード RGBA を JPEG として書き込むことはできません。

エラーの原因は、PNGとJPGの画像モードが違うからです。PNGは4チャンネルのRGBAモード、つまり赤、緑、青、アルファの透過色で、JPGは3チャンネルのRGBモードです。ですから、画像フォーマットを変換するには、PNGを3チャンネルのRGBモードに変換する必要があります。

Imageクラスが提供するconvert()メソッドは、画像モードの変換を行うことができます。この関数には、モード、マトリクス、ディザなどのパラメータが用意されています。最も重要なパラメータは mode であり、残りのパラメータは気にする必要はありません。構文の形式は以下のとおりです.

convert(mode,parms**)
    {を使用します。 mode:変換する画像モードを指します。
  • params: その他のオプションのパラメータです。

修正後のコードは以下の通りです。

from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
# At this point a new image object is returned, converting the image mode
image=im.convert('RGB')
#call save() to save
image.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')

上記のコードでは、PNG画像をJPG形式に変換することに成功しています。 

ピローイメージ.save jpg画像圧縮で保存

PillowのImage.save()メソッドで、デフォルトのパラメータでjpg画像を保存すると、画像が非常に圧縮され、元のサイズが数十Kになることがありました。これはjpg保存時に圧縮アルゴリズムで画像を内部圧縮しているためです。

しかし、画像サイズがあまり変わらないように、あるいは小さくなりすぎないようにしたい場合があります。そこで、この方法を使うときは、パラメータを追加します。

imObj.save(img_name, quality=95)

qualityパラメータ:画像の品質を保存します。値の範囲は1(最悪)〜95(最高)です。デフォルト値は75で、95より高い値の使用は避けるべきです。100はJPEG圧縮アルゴリズムの一部を無効化し、大きなファイルでは画質の向上がほとんどありません。

このパラメータを使用すると、画像サイズが大きくなります。画像サイズが足りない場合、他に画像サイズを大きくする方法はありますか?

ドキュメントを確認し、試してみたところ、saveメソッドには、画像サイズを大幅に増加させることができる品質で使用できる別のパラメータがあることがわかりました。

imObj.save(new_name, quality=95, subsampling=0)

サブサンプリングパラメータ:サブサンプリング、輝度情報よりも色度情報の解像度を低くして画像を符号化すること。(参考 https://en.wikipedia.org/wiki/Chroma_subsampling )

サブサンプリング値は0,1,2が可能で、4:4:4,4:2,4:1:1に対応します(または4:2:0?)

慣れてくれば、0にすることで画像サイズを大きくする必要性が満たされます。

注)上記の方法のパラメータは、JPG/JPEG形式で保存された画像にのみ適用されます。

参考文献 https://pillow.readthedocs.io/en/5.1.x/handbook/image-file-formats.html#jpeg

参考文献 https://pillow.readthedocs.io/en/4.0.x/PIL.html

今回はPythonのPillow Image.save jpg画像圧縮問題についての記事を紹介します。より関連するPillow Image.save jpgの内容はBinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。