Python Pillow Image.save jpg画像圧縮問題
ピロー画像フォーマット変換
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の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。
関連
-
[解決済み] ImportError: sklearnという名前のモジュールがない(Python)
-
[解決済み] Node.jsの依存性のためにWindowsでPythonを実行する
-
[解決済み] ValueError: xとyは同じサイズでなければならない
-
[解決済み] Scipy Normaltestはどのように使用されるのですか?
-
[解決済み] IDLEで行番号をオンにするには?
-
[解決済み] sqlite3.OperationalError: 認識できないトークン:"01T00" Python datestamp
-
[解決済み] Redis Python - 特定のパターンに従ってすべてのキーを削除する方法 pythonで、pythonのイテレーションなし
-
[解決済み] Python subprocess.Popen() 完了待ち [重複]。
-
[解決済み] django 変数をグローバルに使用する方法
-
jinja2.exceptionsでTemplateNotFoundエラーが発生しました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
[解決済み] '_pywrap_tensorflow_internal' という名前のモジュールはありません。
-
[解決済み】WindowsでコマンドラインからJupyterを実行する
-
[解決済み] Python Azure CLI で popen コマンドにパイピング変数を発行する
-
[解決済み] タイプオブジェクト 'datetime.datetime' は属性 'datetime' を持ちません。
-
[解決済み] Matplotlib の pyplot 軸フォーマッタ
-
[解決済み] OperationalError, no such column. ジャンゴ
-
[解決済み] com.apple.xbs フォルダがありません。
-
python install psycopg2 error 'Error: pg_config executable not found' (エラー: pg_config 実行ファイルが見つかりません。
-
PythonはModuleNotFoundErrorを解決します。Queue' という名前のモジュールがない