使用PIL在Python中围绕文本创建光环?

时间:2012-08-17 15:15:43

标签: python text python-imaging-library

我正在使用PIL为一些图片加水印,而我很难阅读一些文字(深色背景上的黑色文字)。我不能改变文字颜色,因为我有各种各样的背景颜色。有没有办法在文本周围添加光环效果?

例如: http://i.imgur.com/WYxSU.jpg 最底层的文字是我所得到的,顶部的文字是我希望得到的(颜色旁边)。我真的需要在文本周围留一个薄的轮廓。有任何想法吗?我可以上传一些代码,如果你真的认为它会有所作为,但它只是一个普通的PIL ImageDraw.Draw命令。谢谢!

1 个答案:

答案 0 :(得分:9)

如果你不太关心速度,你可以使用作文:

  1. 在空白RGBA图片
  2. 上绘制带有光晕颜色的文字
  3. 模糊
  4. 再次使用文字颜色绘制
  5. 将此图像反转以获得合成蒙版
  6. 与原始图片“合并”
  7. 例如:

    import sys
    import Image, ImageChops, ImageDraw, ImageFont, ImageFilter
    
    def draw_text_with_halo(img, position, text, font, col, halo_col):
        halo = Image.new('RGBA', img.size, (0, 0, 0, 0))
        ImageDraw.Draw(halo).text(position, text, font = font, fill = halo_col)
        blurred_halo = halo.filter(ImageFilter.BLUR)
        ImageDraw.Draw(blurred_halo).text(position, text, font = font, fill = col)
        return Image.composite(img, blurred_halo, ImageChops.invert(blurred_halo))
    
    if __name__ == '__main__':
        i = Image.open(sys.argv[1])
        font = ImageFont.load_default()
        txt = 'Example 1234'
        text_col = (0, 255, 0) # bright green
        halo_col = (0, 0, 0)   # black
        i2 = draw_text_with_halo(i, (20, 20), txt, font, text_col, halo_col)
        i2.save('halo.png')
    

    它有很多优点:

    • 结果很顺利,看起来不错
    • 您可以选择不同的过滤器而不是BLUR来获得不同的“光环”
    • 即使使用非常大的字体也能正常工作,看起来仍然很棒

    要获得较厚的光环,您可以使用以下过滤器:

    kernel = [
        0, 1, 2, 1, 0,
        1, 2, 4, 2, 1,
        2, 4, 8, 4, 1,
        1, 2, 4, 2, 1,
        0, 1, 2, 1, 0]
    kernelsum = sum(kernel)
    myfilter = ImageFilter.Kernel((5, 5), kernel, scale = 0.1 * sum(kernel))
    blurred_halo = halo.filter(myfilter)
    

    部分scale = 0.1 * sum(kernel)使光环变厚(小值)或变暗(大值)。