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

use*_*225 6 python text python-imaging-library

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

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

Jan*_*rny 9

如果你不太关心速度,你可以使用组合:

  1. 在空白RGBA图像上绘制带有光晕颜色的文本
  2. 模糊吧
  3. 用文字颜色再次绘制它
  4. 反转此图像以获得合成蒙版
  5. 与原始图像"合并"

例如:

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

它有很多优点:

  • 结果很顺利,看起来不错
  • 你可以选择不同的过滤器而不是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)
Run Code Online (Sandbox Code Playgroud)

该部分scale = 0.1 * sum(kernel)使光晕更厚(小值)或更暗(大值).