¿Cómo reducir un tamaño jpeg a un ‘tamaño deseado’?

En Python 3.x, estoy usando PIL para cambiar el tamaño de las imágenes, sé que podemos reducir la altura o el ancho por sustracción o división por píxeles. Pero, ¿es posible cambiar el tamaño de una imagen a un tamaño deseado, digamos 200 kb y mantener sus proporciones? Asumiendo que la (s) imagen (es) es más grande pero el tamaño es desconocido.

Todavía estoy aprendiendo Python , por lo que puede haber mejores maneras, pero aquí hay una función que guarda una imagen de PIL / Pillow como JPEG y le permite especificar un tamaño máximo.

Utiliza una búsqueda binaria para minimizar la cantidad de trabajo necesario y se codifica en el BytesIO memoria BytesIO para guardar las imágenes escritas en el disco. Si alguien tiene alguna sugerencia para mejorar, ¡hágamelo saber!

 #!/usr/local/bin/python3 import io import math import sys import numpy as np from PIL import Image def JPEGSaveWithTargetSize(im, filename, target): """Save the image as JPEG with the given name at best quality that makes less than "target" bytes""" # Min and Max quality Qmin, Qmax = 25, 96 # Highest acceptable quality found Qacc = -1 while Qmin <= Qmax: m = math.floor((Qmin + Qmax) / 2) # Encode into memory and get size buffer = io.BytesIO() im.save(buffer, format="JPEG", quality=m) s = buffer.getbuffer().nbytes if s <= target: Qacc = m Qmin = m + 1 elif s > target: Qmax = m - 1 # Write to disk at the defined quality if Qacc > -1: im.save(filename, format="JPEG", quality=Qacc) else: print("ERROR: No acceptble quality factor found", file=sys.stderr) ################################################################################ # main ################################################################################ # Load sample image im = Image.open('/Users/mark/sample/images/lena.png') # Save at best quality under 100,000 bytes JPEGSaveWithTargetSize(im, "result.jpg", 100000) 

Si lo ejecuto como está, con un tamaño objective de 100,000 bytes, obtengo:

 -rw-r--r--@ 1 mark staff 96835 11 Sep 18:21 result.jpg 

Si cambio el tamaño de destino a 50,000 bytes, obtengo:

 -rw-r--r--@ 1 mark staff 49532 11 Sep 18:26 result.jpg 

Palabras clave: Python, PIL, Almohada, JPEG, calidad, configuración de calidad, tamaño máximo, tamaño máximo, imagen, procesamiento de imágenes, búsqueda binaria.