2014-04-03 23 views
6

Używam pgmagick do wygenerowania okrągłej miniatury. Używam procesu podobnego do omawianego here, który rzeczywiście tworzy miłą okrągłą miniaturę. Jednak potrzebuję białej granicy wokół promienia koła.Wygeneruj gładką białą obwódkę wokół okrągłego obrazu

Moim początkowym podejściem było stworzenie nowego obrazu nieco większego białego koła z przezroczystym tłem i złożenie miniatury nad tym, pozwalając białemu kółku "wyskoczyć" spod miniatury i stworzyć efekt granicy. Oto kod pgmagick kiedyś osiągnąć:

border_background = Image(Geometry(220, 220), Color('transparent')) 
drawer = Draw() 
drawer.circle(110, 110, 33.75, 33.75) 
drawer.fill_color(Color('white')) 
drawer.stroke_antialias(False) 
border_background.draw(drawer.drawer) 
border_background.composite(original_thumbnail, 0, 0, CompositeOperator.OverCompositeOp) 

to „działa”, ale otaczający biały granica jest dość zniekształcony z wzburzone krawędzie - nie produkcja gotowa. Jeśli wyjmę drawer.stroke_antialias (False), jest jeszcze gorzej.

Jakieś pomysły na ulepszenie tej granicy za pomocą pgmagick?

Odpowiedz

7

zostawiam to jako proste ćwiczenie dla czytelnika, aby przekształcić to rozwiązanie z poleceń do pgmagick (więcej poniżej) . Kod leżący u podstaw pgmagick jest taki sam, jak kod używany w linii poleceń.

Można narysować okrąg większy, a następnie "zmienić jego rozmiar". Łagodzi to efekt koślawości okręgu poprzez uśrednianie krawędzi z otaczającym tłem podczas operacji zmiany rozmiaru.

Zamiast

gm convert -size 220x220 xc:none -fill white \ 
     -draw "circle 110,110, 33.75,33.75" \ 
     original.png 

Wykonaj:

gm convert -size 880x880 xc:none -fill white \ 
     -draw "circle 440,440, 135,135" \ 
     -resize 25% resized.png 

można spróbować inne rozmiary i zdecydować, który jest najmniejszym, który spełnia cię np

gm convert -size 440x440 xc:none -fill white \ 
     -draw "circle 220,220, 67.5,65.5" \ 
     -resize 50% resized.png 

Ten poleceń działa zarówno na GraphicsMagick ("gm convert") i ImageMagick ("convert")

Patrząc na dokumentację pgmagick pod adresem http://pgmagick.readthedocs.org/en/latest/cookbook.html#scaling-a-image nie jest jasne, czy pgmagick oferuje "zmianę rozmiaru". Dokumentacja pokazuje "img.scale", co prawdopodobnie doprowadzi do ostrego koła. Użycie "-scale" w powyższym przykładzie wiersza poleceń zamiast "-resize" rzeczywiście powoduje powstanie tego samego marnego obrazu.

pgmagick ma jednak pozwalają określić rodzaj filtra, jak w

img.scale((150, 100), 'lanczos') 

które powinny być równoważne „-resize” i to, co chcesz.

5

Dostaniesz lepszy wynik w przypadku wybrania innego podejścia:

# First draw the thumbnail inside the circle. 
background = Image(Geometry(220, 220), Color('transparent')) 
drawer = Draw() 
drawer.circle(110, 110, 33.75, 33.75) 
drawer.fill_color(Color('white')) 
background.draw(drawer.drawer) 
background.composite(original_thumbnail, 0, 0, CompositeOperator.InCompositeOp) 

# Draw only the border of the circle on top of the thumbnail inside the circle 
border = Image(Geometry(220, 220), Color('transparent')) 
drawer.fill_color(Color('transparent')) 
drawer.stroke_color(Color('white')) 
drawer.stroke_width(3) 
border.draw(drawer.drawer) 
background.composite(border, 0, 0, CompositeOperator.OverCompositeOp) 
Powiązane problemy