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

use*_*661 6 python imagemagick graphicsmagick pgmagick

我正在使用pgmagick生成一个圆形缩略图.我正在使用类似于此处讨论的过程,这确实为我生成了一个漂亮的圆形缩略图.但是,我需要在圆的半径周围有一个白色边框.

我最初的方法是创建一个具有透明背景的稍大的白色圆圈的新图像,并将缩略图复合在其上,让白色圆圈从缩略图下方"峰顶"并创建边框效果.这是我用来实现的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)
Run Code Online (Sandbox Code Playgroud)

这"有效",但周围的白色边框相当扭曲,边缘不连贯 - 没有生产就绪.如果我拿出drawer.stroke_antialias(False),那就更糟了.

有关使用pgmagick使这个边框更平滑的任何想法?

Gle*_*son 7

我把它作为一个简单的练习留给读者将这个解决方案从命令行转换为pgmagick(参见下文).pgmagick底层的代码与命令行使用的代码相同.

您可以绘制更大的圆圈然后"调整"它.这通过在调整大小操作期间使边缘与周围背景平均来改善圆的锯齿状外观.

代替

gm convert -size 220x220 xc:none -fill white \
       -draw "circle 110,110, 33.75,33.75" \
       original.png
Run Code Online (Sandbox Code Playgroud)

做这个:

gm convert -size 880x880 xc:none -fill white \
       -draw "circle 440,440, 135,135" \
       -resize 25% resized.png
Run Code Online (Sandbox Code Playgroud)

您可以尝试其他尺寸并确定哪个尺寸最小,例如,

gm convert -size 440x440 xc:none -fill white \
       -draw "circle 220,220, 67.5,65.5" \
       -resize 50% resized.png
Run Code Online (Sandbox Code Playgroud)

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

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

但是,pgmagick允许您指定过滤器类型,如

 img.scale((150, 100), 'lanczos')
Run Code Online (Sandbox Code Playgroud)

它应该相当于"-resize"并且是你想要的.


dle*_*tra 5

如果您选择不同的方法,您将获得更好的结果:

# 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)
Run Code Online (Sandbox Code Playgroud)