2009-05-20 11 views

Respuesta

62

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 ​​

alt text


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:

  • La máscara ahora está invertida. El blanco fue reemplazado por negro y viceversa.
  • Me estoy convirtiendo en 'P' con una paleta 'adaptativa'. De lo contrario, PIL solo usará colores seguros para la web y el resultado se verá mal.
  • estoy añadiendo información con transparencia a la imagen

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.

+0

¡Estupendo! ¿Y qué hay de la salida de gif en lugar de png? Supongo que GIF no maneja alfa, ¿verdad? – ohnoes

+0

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. –

+0

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

19

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.

+1

¡Amigo, los ANTIALIAS hicieron una gran diferencia! ¡Gracias! = D – ademarizu

+0

Esto funcionó muy bien para mí. No es necesario diseñar una máscara. –

Cuestiones relacionadas