PIL(とほとんどの場合、libjpegを使用するすべてのソフトウェア/ライブラリ)では、品質設定は、量子化テーブル(ref.)の作成に使用されます。 libjpegでは、品質番号はサンプルテーブルの値を「スケール」します(JPEG仕様のセクションK.1から)。他のライブラリーでは、異なる表に異なる品質(例:Photoshop、デジタルカメラ)が割り当てられています。
他の点で言えば、品質は量子化テーブルと等しいので、それは単なる数値です。
変更イメージを同じ「品質」で保存する場合は、同じ量子化テーブルを使用する必要があります。幸い、各JPEGには量子化テーブルが埋め込まれています。残念ながら、PILに保存する際には、量子化テーブルを指定することはできません。 libjpegに付属のコマンドラインユーティリティであるcjpeg
はこれを行うことができます。あなたはorginal JPEGからの量子化テーブルを抽出する方法を見つける必要があります
from subprocess import Popen, PIPE
from PIL import Image, ImageFilter
proc = Popen('%s -sample 1x1 -optimize -progressive -qtables %s -outfile %s' % ('path/to/cjpeg', '/path/ta/qtable', 'out.jpg'), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
P = '6'
if im.mode == 'L':
P = '5'
stdout, stderr = proc.communicate('P%s\n%s %s\n255\n%s' % (P, im.size[0], im.size[1], im.tostring()))
:
は、ここで指定された量子化テーブルとJPEGを保存するいくつかの大まかなコードです。あなたが見つけ、サンプリングを設定することも必要になります
djpeg -verbose -verbose image.jpg > /dev/null
:djpeg
は、その(のlibjpegの一部)を行うことができます。そのチェックの詳細についてはhereを参照してください。あなたはまた、test_subsampling
UPDATE
で見ることができ、私はJPEGを保存するときにサブサンプリングや量子化テーブルを指定するか、またはその両方する機能を追加するために、PILフォークをしました。保存するときにquality='keep'
を指定することもできます。画像は元のJPEGと同じ量子化テーブルとサブサンプリングで保存されます(オリジナルはJPEGにする必要があります)。保存するときに品質に渡すことができるプリセット(Photoshopベース)もあります。 My fork.
UPDATE 2
私のコードは今Pillow 2.0の一部です。だから行います
pip install Pillow
関連情報:http://superuser.com/questions/62730/how-to-find-the-jpg-quality/91083#91083それは正確に回復することはできません一般的に – unutbu
保存された情報を減らすさまざまな方法があり、品質値がエンコーダのガイドラインに過ぎないため、JPEGファイルを圧縮するために使用される高品質の値ですが、@unutbuが指摘するように、いくつかのソフトウェアは英雄的な推測を行うことができます。 – andrewmu
JPEGは損失の多いフォーマットなので、画像を開いて保存すると、「品質」オプションが同じ値に設定されていても画質が低下します。 –