【问题标题】:Generate Smooth White Border Around Circular Image在圆形图像周围生成平滑的白色边框
【发布时间】:2023-03-22 09:52:01
【问题描述】:

我正在使用 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 使这个边框更平滑的任何想法?

【问题讨论】:

    标签: python imagemagick graphicsmagick pgmagick


    【解决方案1】:

    我把它作为一个简单的练习让读者将这个解决方案从 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')
    

    这应该等同于“-resize”并且是你想要的。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        相关资源
        最近更新 更多