2012-08-17 10 views
5

私はPILを使っていくつかの写真に透かしを入れていて、テキストの一部(暗い背景に黒い文字)を読みにくいです。私は背景色の広い配列を持っているので、私はテキストの色を変更することはできません。テキストの周囲にハロー効果を追加する方法はありますか?PILを使用してPythonでテキストの周囲にハローを作成しますか?

例: http://i.imgur.com/WYxSU.jpg 下のテキストは私が持っているもので、上のテキストは私が得たいものです(色は脇に)。私は本当にテキストの周りに薄い輪郭が必要です。何か案は?あなたが実際にそれが違いを生むと思うなら、私はいくつかのコードをアップロードすることができますが、それは通常のPIL ImageDraw.Drawコマンドです。ありがとう!

+1

テキストを3回印刷します。最初の2つは、輪郭の色とオフセットが(-1、-1)と(1,1)であり、3つ目は元の位置の元の色です。 – Matthias

+2

http://mail.python.org/pipermail/image-sig/2009-May/005681.html http://stackoverflow.com/a/8050556/442650 –

+0

PIL.ImageDrawには「アウトライン」オプションがありますが、テキストには無効です。 –

答えて

7

あなたはあまりスピードを気にしない場合は、組成物を用いてそれを行うことができます:空白RGBA画像上のハロー色で

  1. ドローテキスト
  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)は(小さい値)または調光器(大きな値)ハローが厚くなります。

+0

質問の例のように、適切なアウトラインがこのように見えると思いますが、これが「ハロー」を生成する正しい方法です。唯一の欠点は、それが得られる調光器のハローを広げるほど広いことです。私は、PILがRGBAイメージを別のイメージにブレンドするより簡単な方法を提供していないことに少し失望しています。 –

+0

ありがとうございました。ちょうど1つの質問...ぼかしは非常にぼやけています...黒いテキストと白いぼかしで...ぼやけは実際には黒い背景で不可視になります。どのようにこれを鋭くすることができますか?たぶんそれは厚いハローの意味ですか? – Jonny

+0

@ジョニーはい、おそらくそれでしょう。または、別のフィルタを使用することもできます(http://pillow.readthedocs.org/en/latest/reference/ImageFilterを参照してください)。html)、http://pillow.readthedocs.org/en/latest/reference/ImageFilter.html#PIL.ImageFilter.Kernelで* scale *または* offset *の値で再生する –