174 votos

¿Cómo cambiar el tamaño de una imagen utilizando PIL y mantener su relación de aspecto?

¿Hay una manera obvia de hacerlo que me estoy perdiendo? Estoy tratando de hacer que las miniaturas.

228voto

gnud Puntos 26854

Definir un tamaño máximo. Para calcular una proporción redimensionar tomando min(maxwidth/width, maxheight/height) .

El tamaño correcto es oldsize*ratio .

Por supuesto también hay un método de biblioteca para hacerlo: el método Image.thumbnail .
A continuación es un ejemplo de la documentación de PIL(edited).

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size, Image.ANTIALIAS)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for '%s'" % infile

66voto

tomvon Puntos 743

Este script redimensiona una imagen (somepic.jpg) usando PIL (Python Imaging Library) para un ancho de 300 píxeles y una altura proporcional a la anchura de nueva. Esto se logra determinar qué porcentaje de 300 píxeles es de la anchura original (img.size[0]) y luego multiplicando la altura original (img.size[1]) por ese porcentaje. Cambie "basewidth" a cualquier otro número para cambiar el ancho predeterminado de las imágenes.

import PIL
from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
img.save('sompic.jpg')

37voto

Franz Puntos 652

También recomiendo el método del PIL en miniatura, porque te quita todos los problemas de relación.

Una importante sugerencia, aunque: reemplazar

im.thumbnail(size)

con

im.thumbnail(size,Image.ANTIALIAS)

de forma predeterminada, PIL utiliza el filtro de Image.NEAREST para cambiar el tamaño que se traduce en buen funcionamiento, pero de mala calidad.

15voto

PIL ya tiene la opción de recortar una imagen

img = ImageOps.fit(img, size, Image.ANTIALIAS)

8voto

Chris Cameron Puntos 3841

¿Si están tratando de mantener la misma proporción de aspecto, entonces no cambiar el tamaño de un porcentaje del tamaño original?

Por ejemplo, la mitad del tamaño original

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: