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)
quality
編集2:最小の試行回数で最適なものを取得するために、上記を使用した二分探索を次に示します。
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