事前にJPEG圧縮を予測することはできません。あなたが説明した方法は、私が知っている唯一の方法です、再度&測定&を試してください。
さまざまな画質設定でいくつかの一般的な画像を圧縮し、最適な開始点を知り、設定の変更がどのようにサイズに影響するかを推測することができます。それは、あまりにも多くの反復をせずに最適なサイズでゼロになるでしょう。
ファイルに似たオブジェクトをsave
関数に渡すこともできます。この関数は、ディスクに書き込むのに気にせず、バイト数を数えるだけです。最適な設定を決定したら、それを実際のファイルに再度保存することができます。
編集:ここには、適切なバイトカウントファイルオブジェクトの実装があります。保存後にsize
をチェックするだけです。
class file_counter(object):
def __init__(self):
self.position = self.size = 0
def seek(self, offset, whence=0):
if whence == 1:
offset += self.position
elif whence == 2:
offset += self.size
self.position = min(offset, self.size)
def tell(self):
return self.position
def write(self, string):
self.position += len(string)
self.size = max(self.size, self.position)
編集2:ここでは試行の最小回数で最適quality
を取得するために、上記を使用してバイナリ検索です。
def smaller_than(im, size, guess=70, subsampling=1, low=1, high=100):
while low < high:
counter = file_counter()
im.save(counter, format='JPEG', subsampling=subsampling, quality=guess)
if counter.size < size:
low = guess
else:
high = guess - 1
guess = (low + high + 1) // 2
return low
を持つ有用誰かかもしれないので、私はここに私のコードを提供しますゲス。したがって、50%の品質で始まり、サイズが小さすぎる場合は75%を試し、そうでない場合は25%を試してください。可能な限り500KBに近づくでしょう。最小の品質またはサイズの許容差。最大7回の反復で正しい圧縮レベルにゼロインすることができます。 –