使用PIL在Python中为文本创建光晕?

7
我正在使用PIL给一些图片添加水印,但是我很难辨认一些文字(黑色文字在暗色背景上)。由于我有各种不同的背景颜色,所以不能只改变文本颜色。是否有办法在文本周围添加光晕效果呢?
例如: http://i.imgur.com/WYxSU.jpg 底部的文本是我已经有的,而顶部的文本是我希望得到的(除了颜色)。我只需要在文本周围添加一个薄的轮廓线即可。有什么想法吗?如果你真的认为它会有所帮助,我可以上传一些代码,但这只是一个普通的PIL ImageDraw.Draw命令。谢谢!

1
打印文本三次。前两次使用轮廓颜色和偏移量为(-1,-1)和(1,1),第三次在原始位置使用原始颜色。 - Matthias
2
http://mail.python.org/pipermail/image-sig/2009-May/005681.htmlhttps://dev59.com/KGsz5IYBdhLWcg3wNVES#8050556 - Jonathan Vanasco
PIL.ImageDraw有一个“outline”选项,但它对于文本无效。 - Mark Ransom
1
@HassanBaig 有时候了解哪些事情不值得尝试,这样你就不会浪费时间在上面。 - Mark Ransom
这个回答解决了你的问题吗?在PIL中有没有一种方法可以用深色线条勾勒文本? - Flair
显示剩余2条评论
1个回答

14

如果您不太关心速度,可以使用组合来实现:

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

它有许多优点:

  • 结果平滑且美观
  • 您可以选择不同的过滤器而不是 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)

这部分代码可以让光晕更厚(小值)或者更暗淡(大值)。


我认为在这种情况下,一个适当的大纲会更好,就像问题中的示例一样,但这是生成“光晕”的正确方法。唯一的缺点是,你越宽的光晕,它就越暗淡。我有点失望PIL没有提供一种更直接的方式来混合RGBA图像。 - Mark Ransom
很酷,谢谢。只有一个问题...模糊非常模糊...黑色文本和白色模糊...事实上,在黑色背景上,模糊确实变得看不见了。我们该如何让它更清晰?也许这就是您所说的更厚的光晕? - Jonny
@Jonny 是的,那可能就是了。或者,您可以使用不同的过滤器(请参见:http://pillow.readthedocs.org/en/latest/reference/ImageFilter.html),在http://pillow.readthedocs.org/en/latest/reference/ImageFilter.html#PIL.ImageFilter.Kernel中尝试*scale*或*offset*值。 - Jan Spurny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接