8

mam kwadratową logo i muszę go round_corner, poszukiwanej przez jakiś czas i dostałem kod po „pracy”:jak zaokrąglić_okrąstwo logo bez białego tła (przezroczyste?) Na nim za pomocą 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) 

potem zapisany zwrócony obiekt obrazu, jednak ma białym tle w rogu like this Jak mogę pozbyć się białego tła lub uczynić je niewidocznym? góry dzięki ~

EDIT: oto kod przez Fraxel, dzięki ~

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

Jestem tak sorry..I trzeba kształtu obrazu będzie elipsa nie prostokąt, tj. piszę rzeczy z obrazka i @fraxel, wciąż widzę biały narożnik na obrazku, który dla mnie przetworzyłeś

Odpowiedz

14

Po pierwsze, upewnij się, że są zapisywania obrazu w formacie, który obsługuje przezroczystość. PNG does, JPG does not ... Poniżej znajduje się całkiem ładny kod, który doda przezroczyste rogi. To działa tak:

  1. Rysuje okrąg o promieniu, rad korzystając draw.ellipse()
  2. Załóż zdjęcie alfa kanał ten sam rozmiar jak obrazie
  3. Chop naszego okręgu na cztery części (zaokrąglone narożniki) i umieścić je w odpowiednich narożnikach obrazu alfa
  4. Put kanał alfa w obrazie przy użyciu putalpha()
  5. Zapisz jako png, a tym samym zachowania przejrzystości.

Oto kod:

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

przykład zakrzywiona krawędź tygrys:

enter image description here

tutaj jest obraz, przetwarzane z tego kodu, dając przezroczyste narożniki:

enter image description here

+0

dzięki, ale wciąż ma biały kąt w tle. Sprawdź to [link] (http://www.flickr.com/photos/[email protected]@ N03/7485468218/in/photostream), aby zobaczyć problem, i potrzebuję niewidoczny różowy narożnik, w twoim przypadku biały narożnik (U nie widzę go tutaj, ponieważ jest biały, ten sam kolor co strona internetowa). Hope you understand co mam na myśli – bdictator

+0

@bdictator - proszę zamieścić swój pełny kod. i używasz mojego kodu i zapisujesz jako png? – fraxel

+0

Tak, używam Twojego kodu, sprawdź mój dodany kod – bdictator

0

Czy próbowałeś zastąpić kanał alfa obrazka maską? Wygląda na to, że powinien zrobić to, co chcesz. mask może być w trybie L, aby to działało poprawnie, a image powinno być "RGBA", ale może być automatycznie przekonwertowane dla ciebie.

Górny odpowiedź tutaj zapewnia dobre przykłady: How do I generate circular thumbnails with PIL?

maskę obraz wygląda dobrze, ale myślę, że chcesz zamienić „białe” i „czarne”, więc masz białą zaokrąglony prostokąt dokładnie kształt chcesz mieć swój ostateczny obraz na czarnym tle. Prawdopodobnie będziesz musiał również użyć trybu "L" (skali szarości).

Po utworzeniu tego obrazu można zastąpić return ImageChops.add(mask, image) przez image.putalpha(mask); return image, co powinno spowodować, że obraz będzie przezroczysty tylko w czarnych obszarach maski.

Konieczna może być najpierw konwersja obrazu z image.convert('RGBA'), ale myślę, że nie jest to konieczne w późniejszych wersjach PIL, robi to automatycznie.

coś takiego: (sorry nie można przetestować to teraz)

 
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

, Proszę sprawdzić link, który dodałem, aby zobaczyć problem. Nie sądzę, że link U podany jest tym, czego szukam i nie jestem pewien, co powiedział U na temat alfa .. – bdictator

+0

@bdictator kanału "alfa" jest częścią obrazu, która przechowuje informacje o przezroczystości. 'image.putalpha (maska)' powinno zastąpić tylko informacje o przezroczystości obrazem maski, gdzie kolor maski białej oznacza pełne krycie (brak przezroczystości - obraz oryginalny), a kolor czarny oznacza pełną przezroczystość (całkowicie przezroczyste). Spróbuję zaktualizować odpowiedź, by dodać więcej szczegółów. – mesilliac

+0

Wielkie dzięki, ale wydaje się tak samo z białymi rzeczami na rogu tła – bdictator