「画像にテキストやロゴでウォーターマークを入れたい」
「大量の画像に透かしを入れる必要が出てきた・・・」
このような場合には、この記事の内容が参考になります。
この記事では、Pythonで画像にウォーターマークを入れる方法を解説しています。
本記事の内容
- Pythonで画像にウォーターマークを入れる
- 【サンプルコード】画像へのウォーターマークの追加
- ChatGPTを利用したコーディング
それでは、上記に沿って解説をしていきます。
Pythonで画像にウォーターマークを入れる
ウォーターマーク(透かし)をPythonで入れる方法は、Pillowを利用するのが主流のようです。
これだと言うライブラリも存在していないようです。
透明な透かしを入れるというのは、GitHubで何個かありました。
でも、今回は目に見える透かしを必要としています。
そもそも、なぜウォーターマークは利用されるのでしょうか?
それには、主に以下の目的があります。
- 著作権の保護
- デジタル作品のマーケティング(ブランディング)
マーケティングを考えたときに、透明な透かしではダメですよね。
ということで、Pythonでウォーターマークを画像に追加するコードを書きました。
このようなコードを利用すれば、一括で画像へウォーターマークを追加することが可能です。
以上、Pythonで画像にウォーターマークを入れるについて説明しました。
次は、【サンプルコード】画像へのウォーターマークの追加を説明します。
【サンプルコード】画像へのウォーターマークの追加
まず、ウォーターマークを入れる画像を用意します。
input.jpg

ここでは、以下の2パターンでウォーターマークを追加します。
- テキスト
- 画像(ロゴなど)
それぞれを以下で説明します。
その前に、Pillowをインストールしておきましょう。
Pillowについては、次の記事で説明しています。
インストールするだけなら、次のコマンドで済みます。
pip install Pillow
テキスト
コードを動かすには、フォントが必要です。
何でもいいのですが、「arial.ttf」を用います。
https://www.freefontspro.com/14454/arial.ttf
上記ページからダウンロードできます。
zipを解凍して、「arial.ttf」を取り出します。
「Python」というテキストをウォーターマークとして入れるコードは、以下。
from PIL import Image, ImageDraw, ImageFont
import math
img_path = "input.jpg"
font_path = "arial.ttf"
text = "Python"
try:
im = Image.open(img_path)
font = ImageFont.truetype(font_path, 32)
draw = ImageDraw.Draw(im)
width, height = im.size
text_width, text_height = font.getbbox(text)[2:]
w_space = 200
h_space = 140
count_w = math.ceil(width/w_space)
count_h = math.floor(height/h_space)
for i in range(count_h):
top = text_height + i * h_space
for j in range(count_w):
left = (text_width/2 + j*w_space) if i % 2 else (-1*text_width/2 + j*w_space)
draw.text((left, top), text, font=font, fill=(255, 255, 255))
im.save("watermarked.jpg")
finally:
im.close()
以下の部分における、パスは各自の環境に合わせてください。
img_path = "input.jpg" font_path = "arial.ttf" text = "Python"
「arial.ttf」は、日本語だと文字化けするので注意です。
日本語を表示したい場合は、日本語フォントを指定しましょう。
上記コードが実行されると、次の画像が生成されます。

画像(ロゴなど)
コードを動かすには、ウォーターマークに用いたい画像を用意します。
今回は、次の画像を用意しました。
text.png

若干大きいですが、サイズはコード上で変更可能です。
この画像をウォーターマークに用いるコードは、以下となります。
import math
from PIL import Image
img_path = "input.jpg"
watermark_img_path = "text.png"
with Image.open(img_path) as im, Image.open(watermark_img_path) as text_im:
text_im = text_im.resize((120, 28))
text_width, text_height = text_im.size
width, height = im.size
w_space = 200
h_space = 140
count_w = math.ceil(width/w_space)
count_h = math.floor(height/h_space)
for i in range(count_h):
top = text_height + i * h_space
for j in range(count_w):
if i % 2 == 0:
left = -1*(text_width/2) + j*w_space
else:
left = text_width/2 + j*w_space
im.paste(text_im, (int(left), int(top)),text_im)
im.save("watermarked.jpg")
以下の部分における、パスは各自の環境に合わせてください。
img_path = "input.jpg" watermark_img_path = "text.png"
上記コードが実行されると、次の画像が生成されます。

以上、【サンプルコード】画像へのウォーターマークの追加を説明しました。
最後に、ChatGPTを利用したコーディングを説明しておきます。
ChatGPTを利用したコーディング
上記のサンプルコードは、ChatGPTが教えてくれたコードをベースにしています。
まずは、次のようにChatGPTに指示を出しました。

Pythonで以下の処理をコーディングしてください。
画像にウォーターマークをいれる。
ChatGPTは、その返答として次のコードを書きました。
from PIL import Image, ImageDraw, ImageFont
# 画像ファイルの読み込み
img = Image.open("example.jpg")
# ウォーターマーク用の文字列とフォントの指定
watermark_text = "Copyright Example Co."
font = ImageFont.truetype("arial.ttf", 32)
# 画像に文字を書き込む
draw = ImageDraw.Draw(img)
draw.text((10, 10), watermark_text, font=font, fill=(255, 255, 255, 128))
# 保存
img.save("example_with_watermark.jpg")
これで画像にウォーターマークを入れる処理の基本が、イメージ可能となります。
ただ、これだと画像の左上に一つだけ透かしが入るだけです。
個人的には、iStockのようなウォーターマークをイメージしていました。

そのため、具体的に次の指示をChatGPTへ行いました。

iStockのようなウォーターマークを表示するには?
この後、ChatGPTとは数回質疑応答を繰り返します。
その結果出てきたのは、以下のコードです。
from PIL import Image, ImageDraw, ImageFont
def watermark(img_path, watermark_path, output_path):
with Image.open(img_path) as im:
width, height = int(im.size[0]), int(im.size[1])
x_interval = int(width / 10)
y_interval = int(height / 10)
with Image.open(watermark_path) as watermark:
#ウォーターマークを読み込んで、合わせるためにリサイズ
watermark = watermark.resize((x_interval, y_interval))
#画像に合成
for i in range(0, width, x_interval):
for j in range(0, height, y_interval):
im.paste(watermark, (i, j), watermark)
im.save(output_path)
return output_path
watermark("./input.jpg", "./text.png", "./output.jpg")
実行すると、次のような画像が生成されました。

まだまだ、「美」と言うものがChatGPTにはないのでしょう。
以下のような仕様(微調整)を考えるのは、まだまだ人間の方が得意のようです。
- 奇数行と偶数行で表示位置を変える
- 表示間隔を設ける
この仕様を加味して、あとは自分でロジックを組みました。
でも、完全にChatGPTとの協働作業です。
上記の仕様についても、丁寧に指示すればChatGPTはコーディングできたかもしれません。
しかし、そのやり取りの時間が勿体ないので自分でコーディングしたということです。
以上、ChatGPTを利用したコーディングを説明しました。


