¿Cómo redondear un logotipo sin fondo blanco (¿transparente?) en él usando pil?

Tengo un logotipo cuadrado y necesito redondearlo, buscarlo durante un tiempo y obtener el siguiente código “trabajando”:

def round_corner_jpg(image, radius): """generate round corner for image""" mask = Image.new('RGB', image.size) #mask = Image.new('RGB', (image.size[0] - radius, image.size[1] - radius)) #mask = Image.new('L', image.size, 255) draw = aggdraw.Draw(mask) brush = aggdraw.Brush('black') width, height = mask.size draw.rectangle((0,0,width,height), aggdraw.Brush('white')) #upper-left corner draw.pieslice((0,0,radius*2, radius*2), 90, 180, None, brush) #upper-right corner draw.pieslice((width - radius*2, 0, width, radius*2), 0, 90, None, brush) #bottom-left corner draw.pieslice((0, height - radius * 2, radius*2, height),180, 270, None, brush) #bottom-right corner draw.pieslice((width - radius * 2, height - radius * 2, width, height), 270, 360, None, brush) #center rectangle draw.rectangle((radius, radius, width - radius, height - radius), brush) #four edge rectangle draw.rectangle((radius, 0, width - radius, radius), brush) draw.rectangle((0, radius, radius, height-radius), brush) draw.rectangle((radius, height-radius, width-radius, height), brush) draw.rectangle((width-radius, radius, width, height-radius), brush) draw.flush() del draw return ImageChops.add(mask, image) 

luego guardé el objeto de imagen devuelto, sin embargo, tiene un fondo blanco en una esquina como esta. ¿Cómo puedo deshacerme del fondo blanco o hacerlo invisible? Gracias de antemano ~

EDIT: aquí está el código por fraxel, gracias ~

 def add_corners(im, rad): circle = Image.new('L', (rad * 2, rad * 2), 0) draw = ImageDraw.Draw(circle) draw.ellipse((0, 0, rad * 2, rad * 2), fill=255) alpha = Image.new('L', im.size, "white") w, h = im.size alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0)) alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad)) alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0)) alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad)) im.putalpha(alpha) return im if __name__ == '__main__': im = Image.open('1.jpg') im = add_corners(im, 100) im.save('out.png')` 

Lo siento mucho. Necesito que la forma de la imagen sea elipse, no un rectángulo, es decir, que escriba las letras en la foto, y @fraxel, todavía puedo ver la esquina blanca en la foto que procesaste para mí

En primer lugar, asegúrese de guardar su imagen en un formato compatible con la transparencia. PNG hace, JPG no … A continuación hay un código bastante bueno que agregará esquinas transparentes. Funciona así:

  1. Dibuja un círculo con el radio, rad , usando draw.ellipse()
  2. Crea una imagen para el canal alfa del mismo tamaño que tu imagen
  3. Cortar nuestro círculo en cuatro partes (las esquinas redondeadas), y colocarlos en las esquinas correctas de la imagen alfa
  4. Ponga el canal alfa en su imagen usando putalpha()
  5. Guardar como un png , preservando así la transparencia.

Aquí está el código:

 import Image, ImageDraw def add_corners(im, rad): circle = Image.new('L', (rad * 2, rad * 2), 0) draw = ImageDraw.Draw(circle) draw.ellipse((0, 0, rad * 2, rad * 2), fill=255) alpha = Image.new('L', im.size, 255) w, h = im.size alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0)) alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad)) alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0)) alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad)) im.putalpha(alpha) return im im = Image.open('tiger.jpg') im = add_corners(im, 100) im.save('tiger.png') 

ejemplo de tigre de borde curvo:

introduzca la descripción de la imagen aquí

Aquí está su imagen, procesada con este código, dando esquinas transparentes:

introduzca la descripción de la imagen aquí

¿Has probado algo como image.putalpha(mask) para reemplazar el canal alfa de la imagen con la máscara? Esto parece que debería hacer lo que quieras. mask posible que la mask tenga que estar en el modo ‘L’ para que esto funcione correctamente, y la image probablemente debería ser ‘RGBA’, pero podría convertirse automáticamente.

La respuesta principal aquí proporciona algunos buenos ejemplos: ¿Cómo genero miniaturas circulares con PIL?

Su imagen de máscara se ve bien, pero creo que quiere intercambiar “blanco” y “negro”, por lo que tiene un rectángulo redondeado blanco exactamente la forma que desea que tenga su imagen final, sobre un fondo negro. Es probable que también necesite utilizar el modo ‘L’ (escala de grises).

Una vez que tenga esta imagen, puede reemplazar el return ImageChops.add(mask, image) por image.putalpha(mask); return image image.putalpha(mask); return image y esto debería hacer que la imagen sea transparente solo en las áreas negras de la máscara.

Es posible que deba convertir la imagen primero con image.convert('RGBA') pero creo que esto no es necesario en las versiones posteriores de PIL, lo hace automáticamente.

Algo como: (lo siento, no puedo probar esto ahora)

 def round_corner_jpg (imagen, radio):
     "" "generar esquina redonda para imagen" ""
     mask = Image.new ('L', image.size) # relleno con negro de forma predeterminada
     draw = aggdraw.Draw (máscara)
     brush = aggdraw.Brush ('blanco')
     ancho, alto = máscara.size
     #esquina superior izquierda
     draw.pieslice ((0,0, radio * 2, radio * 2), 90, 180, Ninguno, brocha)
     #esquina superior derecha
     draw.pieslice ((ancho - radio * 2, 0, ancho, radio * 2), 0, 90, Ninguno, pincel)
     #esquina izquierda inferior
     draw.pieslice ((0, altura - radio * 2, radio * 2, altura), 180, 270, Ninguno, pincel)
     #esquina inferior derecha
     draw.pieslice ((ancho - radio * 2, altura - radio * 2, ancho, altura), 270, 360, Ninguno, pincel)
     #center rectángulo
     draw.rectangle ((radio, radio, ancho - radio, altura - radio), pincel)
     # rectángulo de cuatro bordes
     draw.rectangle ((radio, 0, ancho - radio, radio), pincel)
     draw.rectangle ((0, radio, radio, altura-radio), pincel)
     draw.rectangle ((radio, altura-radio, ancho-radio, altura), pincel)
     draw.rectangle ((ancho-radio, radio, ancho, altura-radio), pincel)
     dibujar.flush ()
     image = image.convert ('RGBA')
     image.putalpha (máscara)
     imagen de retorno