2014-04-03 9 views
6

Ich verwende pgmagick, um ein kreisförmiges Miniaturbild zu erzeugen. Ich benutze einen Prozess ähnlich dem, der here besprochen wird, der tatsächlich ein nettes rundes Thumbnail für mich produziert. Allerdings brauche ich einen weißen Rand um den Radius des Kreises.Erstelle einen glatten weißen Rand um das kreisförmige Bild

Meine erste Herangehensweise bestand darin, ein neues Bild eines etwas größeren weißen Kreises mit einem transparenten Hintergrund zu erstellen und das Thumbnail darüber zu bilden, den weißen Kreis unter dem Thumbnail "hervorzuheben" und einen Randeffekt zu erzeugen. Hier ist der pgmagick Code, den ich verwenden, um das zu erreichen:

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) 

Diese ‚funktioniert‘, aber der umgebende weiße Rand ist ziemlich verzerrt mit abgehackt Kanten - nicht Produktion bereit. Wenn ich drawer.stroke_antiialias (False) herausnehme, ist es noch schlimmer.

Irgendwelche Ideen, um diese Grenze mit pgmagick glatter zu machen?

Antwort

7

ich es als eine einfache Übung lassen für die Leser dieser Lösung von Kommandozeile konvertieren pgmagick (mehr siehe unten) . Der Code, der pgmagick zugrunde liegt, ist derselbe, der von der Befehlszeile verwendet wird.

Sie könnten den Kreis größer zeichnen und dann "verkleinern". Dies verbessert das gezackte Aussehen des Kreises, indem während der Größenänderung die Kante mit dem umgebenden Hintergrund gemittelt wird.

Statt

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

tun:

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

könnten Sie andere Größen versuchen und entscheiden, welche der kleinste ist, die Sie erfüllt, zum Beispiel

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

Diese Kommandozeile funktioniert sowohl mit GraphicsMagick ("gm convert") als auch mit ImageMagick ("convert")

Mit Blick auf die Dokumentation von pgmagick unter http://pgmagick.readthedocs.org/en/latest/cookbook.html#scaling-a-image ist nicht klar, dass pgmagick "resize" anbietet. Die Dokumentation zeigt "img.scale", was wahrscheinlich zu einem gezackten Kreis führen wird. Die Verwendung von "-scale" in den obigen Befehlszeilenbeispielen anstelle von "-resize" erzeugt in der Tat dasselbe gezackte Bild.

pgmagick jedoch ermöglicht es Ihnen, den Filtertyp zu spezifizieren, wie in

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

, die auf „-resize“ gleichwertig sein sollte, und ist das, was Sie wollen.

5

Sie erhalten ein besseres Ergebnis, wenn man einen anderen Ansatz wählen:

# 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) 
Verwandte Themen