8

Ho ottenuto un logo quadrato e ho bisogno di round_corner esso, cercato per un po 'e ottenuto il codice di seguito "lavoro":come arrotondare un logo senza sfondo bianco (trasparente?) Usando pil?

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) 

poi ho salvato l'oggetto immagine restituita, tuttavia ha sfondo bianco in un angolo like this Come posso eliminare lo sfondo bianco o renderlo invisibile? Grazie in anticipo ~

EDIT: ecco il codice da Fraxel, grazie ~

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')` 

Sono così sorry..I bisogno della forma immagine da un'ellisse non rettangolo, cioè. la roba da scrivere fuori dalla foto e @fraxel, posso ancora vedere l'angolo bianco nella foto che hai elaborato per me

risposta

14

Prima di tutto, assicurarsi che si sta salvando l'immagine in un formato che supporta la trasparenza. PNG fa, JPG non ... Di seguito è riportato un codice piuttosto carino che aggiungerà angoli trasparenti. Funziona in questo modo:

  1. disegna un cerchio con raggio, rad, utilizzando draw.ellipse()
  2. creare un'immagine per il canale alfa della stessa dimensione dell'immagine
  3. Tritare il nostro cerchio in quattro pezzi (gli angoli arrotondati), e metterli nelle giuste angoli dell'immagine alfa
  4. mettere il canale alfa nella vostra immagine utilizzando putalpha()
  5. Salva come png, preservando così la trasparenza.

Ecco il codice:

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') 

esempio curvo bordo tigre:

enter image description here

ecco la vostra immagine, elaborata con questo codice, dando angoli trasparenti:

enter image description here

+0

grazie, ma ha ancora l'angolo bianco sullo sfondo. Controlla questo [collegamento] (http://www.flickr.com/photos/[email protected] N03/7485468218/in/photostream) per vedere il problema, e ho bisogno che l'angolo rosa sia invisibile, nel tuo caso l'angolo bianco (non riesci a vederlo qui visto che è bianco, lo stesso colore della pagina web) .. Spero tu capisca cosa intendo – bdictator

+0

@bdictator - per favore pubblica il tuo codice completo. e stai usando il mio codice e sto salvando come png? – fraxel

+0

sì, sto usando il tuo codice, controlla il mio codice aggiunto – bdictator

0

Hai provato qualcosa come image.putalpha(mask) per sostituire il canale alfa dell'immagine con la maschera? Sembra che dovrebbe fare quello che vuoi. mask potrebbe essere in modalità "L" perché funzioni correttamente e image dovrebbe essere "RGBA", ma potrebbe essere convertito automaticamente per te.

La risposta superiore qui fornisce alcuni buoni esempi: How do I generate circular thumbnails with PIL?

L'immagine maschera guarda bene, ma penso che si desidera scambiare 'bianco' e 'nero', in modo da avere un rettangolo bianco arrotondato esattamente la forma vuoi che la tua immagine finale sia, su uno sfondo nero. Probabilmente avrai anche bisogno di usare la modalità 'L' (scala di grigi).

Una volta ottenuta questa immagine, è possibile sostituire lo return ImageChops.add(mask, image) entro il image.putalpha(mask); return image e ciò dovrebbe rendere l'immagine trasparente solo nelle aree nere della maschera.

Potrebbe essere necessario convertire l'immagine prima con image.convert('RGBA') ma penso che questo non sia necessario nelle versioni successive di PIL, lo fa automaticamente.

Qualcosa di simile: (purtroppo non testare questo momento)

 
def round_corner_jpg(image, radius): 
    """generate round corner for image""" 
    mask = Image.new('L', image.size) # filled with black by default 
    draw = aggdraw.Draw(mask) 
    brush = aggdraw.Brush('white') 
    width, height = mask.size 
    #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() 
    image = image.convert('RGBA') 
    image.putalpha(mask) 
    return image 
+0

, Si prega di controllare il link che ho aggiunto per vedere il problema.Non penso che il link che U ha dato sia quello che sto cercando e non sono sicuro di quello che ho detto su roba alpha .. – bdictator

+0

@bdictator il canale "alpha" è la parte dell'immagine che contiene le informazioni sulla trasparenza. 'image.putalpha (mask)' dovrebbe sostituire solo le informazioni sulla trasparenza con l'immagine della maschera, dove il colore della maschera bianca significa opacità completa (nessuna trasparenza - immagine originale), e il nero significa piena trasparenza (totalmente visibile). Cercherò di aggiornare la risposta per aggiungere ulteriori dettagli. – mesilliac

+0

Grazie mille, ma sembra lo stesso con roba bianca nell'angolo di backgroud – bdictator