2014-04-03 18 views
6

Sto usando pgmagick per generare una miniatura circolare. Sto usando un processo simile a quello discusso here, che effettivamente produce una bella miniatura circolare per me. Tuttavia, ho bisogno di un bordo bianco attorno al raggio del cerchio.Genera bordo bianco liscio attorno all'immagine circolare

Il mio approccio iniziale era quello di creare una nuova immagine di un cerchio bianco leggermente più grande con uno sfondo trasparente e comporre la miniatura su quella, lasciando che il cerchio bianco "sporgesse" da sotto la miniatura e creare un effetto bordo. Ecco il codice pgmagick che ho usato per raggiungere questo obiettivo:

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) 

Questo 'funziona', ma il bordo bianco circostante è piuttosto distorta con bordi increspate - non pronti per la produzione. Se prendo drawer.stroke_antialias (False), è ancora peggio.

Qualche idea su come rendere più semplice questo bordo con pgmagick?

risposta

7

lo lascio come un semplice esercizio per il lettore di convertire questa soluzione da riga di comando per pgmagick (vedi più in basso) . Il codice sottostante pgmagick è lo stesso di quello usato dalla riga di comando.

È possibile disegnare il cerchio più grande e "ridimensionarlo" verso il basso. Questo migliora l'aspetto nervoso del cerchio calcolando la media del bordo con lo sfondo circostante durante l'operazione di ridimensionamento.

Invece di

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

fare questo:

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

si potrebbe provare altre dimensioni e decidere quale è la più piccola che ti soddisfa, per esempio,

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

Questa riga di comando funziona sia su GraphicsMagick ("gm convert") che ImageMagick ("convert")

Guardando la documentazione di pgmagick allo http://pgmagick.readthedocs.org/en/latest/cookbook.html#scaling-a-image non è chiaro che pgmagick offra "ridimensiona". La documentazione mostra "img.scale" che probabilmente si tradurrà in un circolo vorticoso. L'uso di "-scale" negli esempi della riga di comando sopra invece di "-resize" produce effettivamente la stessa immagine jaggy.

pgmagick ha tuttavia consente di specificare il tipo di filtro, come in

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

che dovrebbe essere equivalente a "-resize" ed è ciò che si desidera.

5

si otterrà un risultato migliore se si sceglie un approccio diverso:

# 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) 
Problemi correlati