Không thể dự đoán trước khi nén JPEG. Phương pháp bạn mô tả, hãy nén & đo & thử lại, là cách duy nhất tôi biết.
Bạn có thể thử nén một số hình ảnh thông thường với các cài đặt chất lượng khác nhau để có ý tưởng về điểm bắt đầu tối ưu, cộng với cách đoán thay đổi cài đặt sẽ ảnh hưởng như thế nào đến kích thước. Điều đó sẽ giúp bạn đạt được kích thước tối ưu mà không cần quá nhiều lần lặp lại.
Bạn cũng có thể chuyển đối tượng giống như tệp tới hàm save
không bận tâm để ghi vào đĩa, chỉ cần đếm byte. Khi bạn đã xác định cài đặt tốt nhất thì bạn có thể lưu lại cài đặt đó vào tệp thực.
Chỉnh sửa: Dưới đây là triển khai đối tượng tệp đếm byte phù hợp. Chỉ cần kiểm tra size
sau khi lưu.
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)
Chỉnh sửa 2: Dưới đây là một tìm kiếm nhị phân sử dụng ở trên để có được tối ưu quality
trong số nhỏ nhất của nỗ lực.
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
Nguồn
2012-11-15 23:08:59
Một cách tốt hơn để làm điều đó là để nhị phân tìm kiếm chất lượng. Vì vậy, bắt đầu với chất lượng 50%, sau đó kiểm tra kích thước, nếu nó quá nhỏ, sau đó thử 75%, nếu không thử 25%, v.v. Bạn sẽ nhận được càng gần càng tốt đến 500KB, bạn có thể bổ sung thêm một số tham số bổ sung, ví dụ. chất lượng tối thiểu hoặc dung sai kích thước. Bạn sẽ có thể không ở mức độ nén chính xác trong tối đa 7 lần lặp. –