あなたはあまりスピードを気にしない場合は、組成物を用いてそれを行うことができます:空白RGBA
画像上のハロー色で
- ドローテキスト
- それは
- で再びそれを描くブラーテキストの色
- 反転を取得するには、この画像合成は
- は、元の画像と「マージ」マスク
例えば
:それは多くの利点ました
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)
は(小さい値)または調光器(大きな値)ハローが厚くなります。
テキストを3回印刷します。最初の2つは、輪郭の色とオフセットが(-1、-1)と(1,1)であり、3つ目は元の位置の元の色です。 – Matthias
http://mail.python.org/pipermail/image-sig/2009-May/005681.html http://stackoverflow.com/a/8050556/442650 –
PIL.ImageDrawには「アウトライン」オプションがありますが、テキストには無効です。 –