画像にウォーターマーク(透かし)を入れる方法は、目的や使うツールによってさまざまです。
たとえば、Canva や Watermarkly のような無料オンラインツールを使えば手軽に透かしを追加できますし、Photoshop や GIMP などの画像編集ソフトを使えば、より細かいデザイン調整も可能です。
しかし、複数枚の画像に同じウォーターマークを自動で一括追加したい場合には、Pythonを使う方法が圧倒的に効率的です。
特にブログ運用やSNS投稿、クライアント納品時など、著作権保護を意識した画像管理が求められる場面で非常に役立ちます。
この記事では、筆者が実際に社内業務やブログ運用で使用している方法として、
Pythonでフォルダ内のすべての画像にウォーターマークを一括追加する方法を詳しく解説します。
フォルダ内のすべての画像にウォーターマークを一括追加するスクリプト
import os
from PIL import Image, ImageDraw, ImageFont
# 入力・出力フォルダの設定
input_folder = r"C:\Users\ユーザー名\watermark_pj\input_images"
output_folder = "watermarked_images"
os.makedirs(output_folder, exist_ok=True)
# ウォーターマーク設定
watermark_text = "Sample Watermark"
font_size = 36
opacity = 128 # 0(完全透明)〜 255(完全不透明)
# フォントの読み込み(Arialがなければデフォルト)
try:
font = ImageFont.truetype("arial.ttf", font_size)
except IOError:
font = ImageFont.load_default()
# 画像処理ループ
for filename in os.listdir(input_folder):
if filename.lower().endswith((".jpg", ".jpeg", ".png", ".bmp", ".gif")):
image_path = os.path.join(input_folder, filename)
image = Image.open(image_path).convert("RGBA")
# ウォーターマークレイヤー作成
watermark_layer = Image.new("RGBA", image.size, (255, 255, 255, 0))
draw = ImageDraw.Draw(watermark_layer)
# テキストサイズと位置(textbboxを使用)
bbox = draw.textbbox((0, 0), watermark_text, font=font)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
x = image.width - text_width - 10
y = image.height - text_height - 10
# ウォーターマーク描画
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, opacity))
# 合成して保存
combined = Image.alpha_composite(image, watermark_layer)
output_path = os.path.join(output_folder, filename)
combined.convert("RGB").save(output_path, format="JPEG")
print("ウォーターマーク付き画像を保存しました。")
実行前の準備
- input_images フォルダを作成し、処理したい画像を入れてください。
watermark_textに任意のテキストを設定します。arial.ttfがない場合は、別のフォントを指定するか自動でデフォルトフォントが使用されます。
※ input_images フォルダはPythonスクリプトと同じディレクトリ階層に作成するのが基本です。
input_images フォルダが見つからないエラーが出た場合
input_folder = "input_images"
これで動作しない場合、以下のように絶対パスで指定すると確実です。
input_folder = r"C:\Users\ユーザー名\watermark_pj\input_images"
※ r を付けることで、Windowsパスのバックスラッシュ (\) をエスケープせずに記述できます。
フォルダ存在チェック付きテストコード
import os
input_folder = "input_images"
if not os.path.exists(input_folder):
print(f"フォルダが見つかりません: {input_folder}")
else:
print(f"フォルダが見つかりました: {input_folder}")
このテストを実行し、フォルダが正しく認識されているか確認してから本処理を行うのがおすすめです。
出力結果
元画像
ウォーターマーク描画後右下に半透明のウォーターマークが挿入されました。
※赤枠は説明用の装飾であり、ウォーターマーク自体ではありません。
文字位置・色・透明度は自由に調整可能で、企業ロゴを透過PNGとして利用することもできます。
ウォーターマークをロゴ画像(.png)にするサンプルコード
import os
from PIL import Image
input_folder = "input_images"
output_folder = "watermarked_images"
logo_path = "logo.png" # ウォーターマーク用ロゴ画像
os.makedirs(output_folder, exist_ok=True)
# ロゴ画像の読み込みとサイズ調整(例:幅100px)
logo = Image.open(logo_path).convert("RGBA")
logo_width = 100
logo_ratio = logo_width / logo.width
logo_size = (logo_width, int(logo.height * logo_ratio))
logo = logo.resize(logo_size, Image.ANTIALIAS)
for filename in os.listdir(input_folder):
if filename.lower().endswith((".jpg", ".jpeg", ".png", ".bmp", ".gif")):
image_path = os.path.join(input_folder, filename)
image = Image.open(image_path).convert("RGBA")
# ウォーターマーク位置(右下)
x = image.width - logo.width - 10
y = image.height - logo.height - 10
# 合成
image.paste(logo, (x, y), logo)
# 保存
output_path = os.path.join(output_folder, filename)
image.convert("RGB").save(output_path, format="JPEG")
print("ロゴ画像を使ったウォーターマーク処理が完了しました。")
input("Enterキーを押すとウィンドウが閉じます...")
必要な準備
- input_images フォルダ:元画像を入れる
- logo.png:透過背景付きのロゴ画像(PNG形式推奨)
- watermarked_images フォルダ:出力先(自動で作成されます)
補足と注意点
logo.pngは透過背景付きが理想。白背景のロゴは画像によっては目立ちすぎることがあります。logo_widthでロゴのサイズを調整可能。image.paste(logo, (x, y), logo)の第3引数で透過を維持しています。
まとめ
PythonとPillowを使えば、複数の画像に著作権保護のウォーターマークやロゴを自動で一括追加できます。
フォルダ指定だけでまとめて処理できるため、SNS投稿・Webサイト更新・社内資料などで効率的に画像管理が可能です。
文字やロゴの位置・透明度も自由にカスタマイズできるので、あなたのブランドやブログの世界観に合わせたウォーターマーク設定を試してみましょう。

