¿Cómo puedo generar miniaturas de imágenes circulares usando PIL? El espacio fuera del círculo debe ser transparente.¿Cómo puedo generar miniaturas circulares con PIL?
Los fragmentos serán muy apreciados, gracias de antemano.
¿Cómo puedo generar miniaturas de imágenes circulares usando PIL? El espacio fuera del círculo debe ser transparente.¿Cómo puedo generar miniaturas circulares con PIL?
Los fragmentos serán muy apreciados, gracias de antemano.
La forma más fácil de hacerlo es mediante el uso de máscaras. Crea una máscara en blanco y negro con cualquier forma que desees. Y puesto que la forma como una capa alfa
from PIL import Image, ImageOps
mask = Image.open('mask.png').convert('L')
im = Image.open('image.png')
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5))
output.putalpha(mask)
output.save('output.png')
Aquí está la máscara Solía
Si desea que el tamaño de las miniaturas a ser variable puede utilizar el ImageDraw y dibujar la máscara.
from PIL import Image, ImageOps, ImageDraw
size = (128, 128)
mask = Image.new('L', size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + size, fill=255)
im = Image.open('image.jpg')
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5))
output.putalpha(mask)
output.save('output.png')
Si desea que la salida en formato GIF a continuación, es necesario utilizar la función de la goma en lugar de putalpha:
from PIL import Image, ImageOps, ImageDraw
size = (128, 128)
mask = Image.new('L', size, 255)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + size, fill=0)
im = Image.open('image.jpg')
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5))
output.paste(0, mask=mask)
output.convert('P', palette=Image.ADAPTIVE)
output.save('output.gif', transparency=0)
Tenga en cuenta que he hecho los siguientes cambios:
Atención:: Hay un gran problema con este enfoque. Si la imagen gif contiene partes negras, todas se volverán transparentes también. Puede solucionar esto eligiendo otro color para la transparencia. Le recomendaría encarecidamente que use el formato PNG para esto. Pero si no puedes, entonces eso es lo mejor que puedes hacer.
me gustaría añadir a la respuesta ya aceptado una solución a AntiAlias el círculo resultante, el truco consiste en producir una máscara más grande y entonces disminuye la escala utilizando un filtro de enmascaramiento: Aquí está el código
from PIL import Image, ImageOps, ImageDraw
im = Image.open('image.jpg')
bigsize = (im.size[0] * 3, im.size[1] * 3)
mask = Image.new('L', bigsize, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + bigsize, fill=255)
mask = mask.resize(im.size, Image.ANTIALIAS)
im.putalpha(mask)
esto produce un resultado mucho mejor en mi opinión.
¡Amigo, los ANTIALIAS hicieron una gran diferencia! ¡Gracias! = D – ademarizu
Esto funcionó muy bien para mí. No es necesario diseñar una máscara. –
¡Estupendo! ¿Y qué hay de la salida de gif en lugar de png? Supongo que GIF no maneja alfa, ¿verdad? – ohnoes
Gif no es compatible con la transparencia del canal alfa. Solo permite establecer un color como transparente. Sin embargo, hice el ajuste necesario para mostrar el resultado en gif. –
excelente respuesta. Mientras puedo aplicar esta técnica fácilmente a las imágenes guardadas, encontré un problema al aplicar la máscara dentro de Python. cualquier posibilidad de que pueda echar un vistazo a esta pregunta: http://stackoverflow.com/questions/20150552/modify-the-alpha-channel-of-an-image-as-part-of-an-image-processing-workflow – zach