画像のサイズに依らず一定のサイズの透かしを追加する【Python】

Pocket

前回記事の続き(というか改善版)

前回記事

前回のままだと画像のサイズに依って表示される文字のサイズが変わってくる(文字のサイズが変わるというよりは画像のサイズが変わることで相対的に見た目が変わってくる。)

ので画像サイズに応じたフォントサイズに設定するように変更。

ついでにフォントサイズを変えると文字が表示される場所も変わったように見えるので、文字を置く座標も画像のサイズに応じて変更。

結果以下のような感じに変更

from PIL import Image, ImageDraw, ImageFont
import os
import glob

# 透かしで表示したい文字
watermark = '© sunfish record' 
# 透かしの透明度
opacity = 80
# 透かし文字の色
color = (255, 255, 255)

# 透かしを追加したい画像を格納したフォルダ名
inputFolder = "input"
# 透かしを追加した画像の出力先のフォルダ名
outputFolder = "output"

# inputフォルダにある全てのJPGファイルを取り込んで編集
i = 1
for path in glob.glob(os.path.join(inputFolder, '*.JPG')):
    base = Image.open(path).convert('RGBA')

    # フォントサイズ指定
    fontsize = base.width * 0.037

    txt = Image.new('RGBA', base.size, (255, 255, 255, 0))
    draw = ImageDraw.Draw(txt)

    # あらかじめどっかからダウンロードしたフォント(ここではInk Free)を指定
    fnt = ImageFont.truetype(font='Ink-Free-Font/InkFree.ttf', size=round(fontsize))

    textw, texth = draw.textsize(watermark, font=fnt)

    # 透かし文字右下
    # 写真のサイズを取得してそれぞれの画像に応じた場所に配置
    draw.text((base.width * 0.708, base.height * 0.9178), watermark, font = fnt,  fill= color + (opacity,))

    out = Image.alpha_composite(base, txt)
    # この状態だとpngで出力される、
    # 今回はjpgで出力するように変換(pngで出そうとするとめっちゃ時間かかる)
    jpgOut = out.convert('RGB')

    # アウトプット先に指定したフォルダにtest~~っていうファイル名で出力される
    # jpgOut.save(outputFolder + '/'+ path + '.JPG', quality=100, optimize=True)
    jpgOut.save(outputFolder + '/WMoutput' + str(i) + '.JPG', quality=100, optimize=True)
    # pngで出力しようと思ったら↑を消して↓のコメントを外す
    # out.save(outputFolder + '/test' + str(i) + '.png', 'png', quality=100, optimize=True)
    print(str(i) + '回目の処理完了')
    i+=1

フォントサイズや座標を設定するときに画像の幅や高さにかけている数字に関しては、1つの画像で試して、丁度いい塩梅になったものの倍率を求めて、それを設定。

3648×5472の画像に対して、フォントサイズ200、座標(画像の幅-1600, 画像の高さ300)がちょうどよかったので

フォントサイズ:200/5472 ≒ 0.037

x座標:1600/5472 ≒ 0.292

→ 1-0.292 = 0.708

y座標:300/3648 ≒ 0.0822

→ 1 – 0.0822 = 0.9178

正確にやるなら分数のままかけた方が良いけどまぁいいかと。

3648×5472のサイズでない写真でやってこんな感じ

サイズや位置は良いけど、この場合はフォントの色を黒くしたいと検討中。

それはまた実装したら記事書く。