在圆形图像周围生成平滑的白色边框

问题描述:

我正在使用pgmagick生成圆形缩略图。我正在使用一个类似于here的流程,它确实为我制作了一个很好的圆形缩略图。但是,我需要在圆的半径周围有一个白色边框。在圆形图像周围生成平滑的白色边框

我最初的做法是创建一个带有透明背景的稍大的白色圆圈的新图像,并在其上合成缩略图,让白色圆圈从缩略图下方“出峰”并创建边框效果。下面是我用来实现该pgmagick代码:

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) 

这个“作品”,但周围的白色边框是波涛汹涌的边缘相当扭曲的 - 而不是生产做好准备。如果我抽取drawer.stroke_antialias(False),那更糟。

使用pgmagick使这个边界更平滑的任何想法?

我把它作为一个简单的练习,为读者该解决方案从 命令行转换为pgmagick(详见下文) 。 pgmagick的基础代码与命令行使用的代码相同。

你可以画出更大的圆,然后“调整”下来。通过在调整大小操作期间将边缘与周围背景平均,可以改善圆圈的锯齿状外观。

而不是

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

这样做:

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

你可以尝试其他尺寸和 决定哪些是满足你最小的,例如,

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

此命令行适用于GraphicsMagick(“gm convert”)和ImageMagick(“convert”)

查看pgmagick文档 http://pgmagick.readthedocs.org/en/latest/cookbook.html#scaling-a-image不清楚pgmagick是否提供“调整大小”。文档显示“img.scale”,这可能会导致锯齿形的圆圈。在上面的命令行示例中使用“-scale”而不是“-resize”确实会产生相同的锯齿形图像。然而

pgmagick确实允许你指定过滤器的类型,如

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

这应该是等同于“调整大小”,是你想要的。

你会得到一个更好的结果,如果你选择了不同的方法:

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