6

PIL を使用していくつかの写真に透かしを入れていますが、一部のテキスト (暗い背景に黒いテキスト) を読むのに苦労しています。さまざまな背景色があるため、テキストの色を変更することはできません。テキストの周りにハロー効果を追加する方法はありますか?

例: http://i.imgur.com/WYxSU.jpg 下部のテキストは私が取得したもので、上部のテキストは取得したいものです (色は別として)。テキストの周りに細いアウトラインが必要です。何か案は?本当に違いがあると思われる場合は、いくつかのコードをアップロードできますが、それは通常の PIL ImageDraw.Draw コマンドです。ありがとう!

4

1 に答える 1

12

速度をあまり気にしない場合は、コンポジションを使用して実行できます。

  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)はハローを厚く (値が小さい) または暗くなります (値が大きい)。

于 2012-08-17T17:02:56.227 に答える