
見出し画像にタイトルを入れたらドロップシャドウの周りに白いところができてしまって嫌だったので、直した
Python とか Pillow というライブラリーをいじる話。
7月19日に初めて見出し画像にタイトルを入れた。あれから2か月が経とうとしている。タイトルと同じというのも芸がないなと思いつつ、続けている。がしかし、一つだけ、気になることがある。
文字の影、ドロップシャドウだが、外側に白いところができてしまうのである。
影が美しくないのである。
次の記事は、見出し画像にタイトルをいれるスクリプトを作ったときに書いたものだが、「ドロップシャドウの外側に白味があるのが気になる。どこか間違っているのだろうか。」と言っていた。
改善できたので、報告。
改善前と改善後の比較












何をやったか
黒い背景を、ぼかした文字でマスクして、それを影にした。
正確に言うと、ぼかした文字の外をマスクしたということ。
手順
黒バックに白い文字を描く。グレースケールモード 'L'。
d_mask.text(img_offset, title, fill=255, font=t_font, anchor='mb', align='center')

ガウスぼかしを適用する
mask = mask.filter(ImageFilter.GaussianBlur(radius=10))
-> マスク画像

これをアルファチャンネルに適用すると、黒いところがマスクされる
RGBA モードで、黒っぽい画像を作る
black_base = Image.new('RGBA', photo.size, color=(0, 0, 0, opacity))
-> ベース画像

ベース画像のアルファチャンネルをマスク画像で置き換える。
black_base.putalpha(mask)
-> ドロップシャドウ画像

背景は、黒でマスクされて透明になっている。
マスク画像を反転しただけじゃないかと思うだろうが、実際、そうかもしれない。
しかしこれでうまくいったので、試してみる気がしない。
しかし、これはテスト用のスクリプトで作ったものだ。本番用のスクリプトに実装するときに、やってみるのかもしれない。
ドロップシャドウ画像に文字を描く
d_black_base.text(img_bottom, title, font=t_font, fill=(255, 255, 255, opacity), anchor='mb', align='center')

背景は、note に貼り付けた結果白くなったが、透明である。
文字を描くと、不透明度の属性を含めて、背景が文字で上書きされる。
タイトル画像にアルファ合成する
title_img = Image.alpha_composite(photo, black_base)

やはり改善前のボケは異常だった。
直してよかった。
直ってよかった。
t.koba