por - Python/Almohada: Cómo escalar una imagen
manipulacion de imagenes con numpy (2)
Supongamos que tengo una imagen que es 2322px x 4128px. ¿Cómo lo escala para que tanto el ancho como el alto sean menos de 1028px?
No podré usar Image.resize
( https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.resize ) ya que eso requiere que le dé a ambos el nuevo ancho y altura. Lo que planeo hacer es (pseudo código abajo):
if (image.width or image.height) > 1028:
if image.width > image.height:
tn_image = image.scale(make width of image 1028)
# since the height is less than the width and I am scaling the image
# and making the width less than 1028px, the height will surely be
# less than 1028px
else: #image''s height is greater than it''s width
tn_image = image.scale(make height of image 1028)
Supongo que necesito usar Image.thumbnail
, pero de acuerdo con este ejemplo ( http://pillow.readthedocs.org/en/latest/reference/Image.html#create-thumbnails ) y esta respuesta ( ¿Cómo puedo cambiar el tamaño de un ¿La imagen utiliza PIL y mantiene su relación de aspecto? ), tanto el ancho como la altura se proporcionan para crear la miniatura. ¿Hay alguna función que tome el nuevo ancho o el nuevo alto (no ambos) y aumente la imagen completa?
No es necesario reinventar la rueda, existe el método Image.thumbnail
disponible para esto:
maxsize = (1028, 1028)
tn_image = image.thumbnail(maxsize, PIL.Image.ANTIALIAS)
Asegura que el tamaño resultante no sea más grande que los límites dados mientras mantiene la relación de aspecto.
La especificación de PIL.Image.ANTIALIAS
aplica un filtro de reducción de resolución de alta calidad para un mejor resultado de cambio de tamaño, probablemente también lo desee.
Usa Image.resize, pero calcula tanto el ancho como el alto.
if image.width > 1028 or image.height > 1028:
if image.height > image.width:
factor = 1028 / image.height
else:
factor = 1028 / image.width
tn_image = image.resize((int(image.width * factor), int(image.height * factor)))