ClaudeCodeで画像処理を自動化する方法【リサイズ・変換・透かし】
「ECサイトに載せる商品画像を、毎回1枚ずつPhotoshopでリサイズしている」「広報用の写真に会社ロゴを透かしで入れたいが、手作業で時間がかかる」「数百枚のスマホ写真をWeb用に圧縮したい」——画像処理は地味に時間を奪う業務の代表格です。本記事では、ClaudeCodeを使って画像のリサイズ・形式変換・透かし追加・トリミングなどを一括で自動化する方法を、初心者向けに丁寧に解説します。Pythonの Pillow(PIL)と、Node.jsの sharp の2系統を扱い、コピペで動くスクリプトを多数掲載しました。
結論:画像処理は「フォルダ単位の一括処理」で劇的に効率化できる
最初に結論をお伝えします。画像処理の自動化で最大の効果を得るコツは、「1枚ずつではなく、フォルダ単位で一括処理する」という発想に切り替えることです。理由は3つあります。第一に、ClaudeCodeと Pillow を組み合わせれば、リサイズ・形式変換・透かし追加といった主要操作はわずか10〜20行のコードで実装でき、フォルダ内の全画像に一気に適用できます。第二に、画像処理は“処理ルールが決まっていれば”ほぼ全自動化できる領域であり、人間の判断を要するのは「どんな仕上がりにするか」を決める最初の一度きりです。第三に、一度作ったスクリプトは何度でも再利用でき、たとえば「Web用1200px、サムネ用400px、SNS用800px」の3バージョンを同時生成するような複雑な処理も、数行の追加で実現できます。本記事では、実際に「商品画像300枚を3サイズ × 透かし入りで一括処理する」スクリプトを完成させるところまで進みます。週に1〜2時間使っていた画像作業が、ボタン1つで終わるようになるはずです。
h2-1. 画像処理ライブラリの選び方:PillowとSharpの違い
画像処理の自動化に使える代表的なライブラリは2つです。
Pillow(Python)
- インストールが簡単(
pip install Pillow) - 機能が豊富で日本語情報も多い
- 初心者向け、業務スクリプトに最適
sharp(Node.js)
- 処理速度が非常に速い(C++製のlibvips利用)
- WebアプリやNext.jsとの相性が良い
- 数千枚規模の大量処理に向く
業務での自動スクリプトなら Pillow で十分です。Webアプリ組み込みなら sharp を検討します。本記事では主に Pillow を使いつつ、要所で sharp の例も紹介します。
プロンプト例1:環境構築
画像処理を始めたいです。Pythonでpip install Pillowを実行する手順と、最低限の動作確認スクリプトを教えてください。
ClaudeCodeの回答:
pip install Pillow
from PIL import Image
img = Image.open("sample.jpg")
print(img.size, img.format, img.mode)
これだけで準備完了です。
h2-2. 基本のリサイズ:縦横比を保ちつつサイズ変更
最も需要が高いのが「リサイズ」です。Webサイト用・SNS用・印刷用——目的別にサイズが変わります。
プロンプト例2:縦横比を保ったままリサイズ
photo.jpg を長辺1200pxにリサイズしてください。縦横比は保ち、ファイル名は photo_1200.jpg にしてください。
from PIL import Image
img = Image.open("photo.jpg")
img.thumbnail((1200, 1200)) # 長辺を1200に
img.save("photo_1200.jpg", quality=85, optimize=True)
print(f"出力: {img.size}")
thumbnail は元画像より大きくなることはないため、安全に使えます。quality=85 はファイルサイズと画質のバランスが良い設定です。
厳密にピクセル指定したい場合
banner.jpg を 1920×1080 ピクセルに厳密に変換してください。アスペクト比が合わない場合は中央でトリミングしてください。
from PIL import Image, ImageOps
img = Image.open("banner.jpg")
img = ImageOps.fit(img, (1920, 1080), Image.LANCZOS)
img.save("banner_fhd.jpg", quality=90)
ImageOps.fit は、はみ出し部分を中央でカットしてくれます。
h2-3. フォルダ単位の一括処理
ここからが本領発揮です。1枚ずつではなく、フォルダ内の全画像に一気に処理を適用します。
プロンプト例3:フォルダ内のJPG画像を全部リサイズ
input フォルダ内のすべての .jpg ファイルを長辺800pxにリサイズし、output フォルダに同じファイル名で保存してください。outputフォルダがなければ作成してください。
from PIL import Image
from pathlib import Path
src = Path("input")
dst = Path("output")
dst.mkdir(exist_ok=True)
for p in src.glob("*.jpg"):
img = Image.open(p)
img.thumbnail((800, 800))
img.save(dst / p.name, quality=85, optimize=True)
print(f"処理: {p.name}")
print("完了")
数百枚あっても、数十秒で終わります。Photoshopで1枚10秒かけていた作業が、文字どおり“桁違い”に速くなります。
サブフォルダも含めて再帰的に処理
input フォルダの中のすべてのサブフォルダにある画像を再帰的に処理してください。フォルダ構造はoutput側にもそのまま再現してください。
from PIL import Image
from pathlib import Path
src = Path("input")
dst = Path("output")
for p in src.rglob("*"):
if p.suffix.lower() not in {".jpg", ".jpeg", ".png"}:
continue
out_path = dst / p.relative_to(src)
out_path.parent.mkdir(parents=True, exist_ok=True)
img = Image.open(p)
img.thumbnail((1200, 1200))
img.save(out_path, quality=85, optimize=True)
rglob を使うことで、深い階層も一気に処理できます。
h2-4. 形式変換:JPG・PNG・WebP・HEIC
サイトのページ速度改善や、社内システム連携のために、画像の形式変換が必要なシーンは増えています。
プロンプト例4:JPG→WebPに一括変換
input フォルダ内のJPG画像をすべてWebPに変換してください。出力先はwebpフォルダで、品質は80に設定してください。
from PIL import Image
from pathlib import Path
src = Path("input")
dst = Path("webp")
dst.mkdir(exist_ok=True)
for p in src.glob("*.jpg"):
img = Image.open(p)
img.save(dst / f"{p.stem}.webp", "WEBP", quality=80, method=6)
print(f"変換: {p.name}")
WebPは同等の画質でJPGより20〜30%軽くなるため、Webサイトの表示速度改善に直結します。
iPhoneのHEICをJPGに変換
iPhoneで撮影したheic画像をjpgに変換したいです。Pillowでheicを開ける拡張を含めたコードを書いてください。
from PIL import Image
import pillow_heif
pillow_heif.register_heif_opener()
for p in Path("input").glob("*.HEIC"):
img = Image.open(p)
img.convert("RGB").save(Path("output") / f"{p.stem}.jpg", quality=90)
事前に pip install pillow-heif が必要です。
h2-5. 透かし(ウォーターマーク)を入れる
ブログ用画像・SNS投稿・配布資料に「会社ロゴ」「Copyright表記」を入れたいケースは多いです。
プロンプト例5:テキスト透かしを入れる
photo.jpg の右下に「© 2026 ACME Inc.」というテキストを白色・半透明で入れてください。フォントサイズは画像幅の3%程度に自動調整してください。
from PIL import Image, ImageDraw, ImageFont
img = Image.open("photo.jpg").convert("RGBA")
overlay = Image.new("RGBA", img.size, (0, 0, 0, 0))
text = "© 2026 ACME Inc."
font_size = int(img.width * 0.03)
font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", font_size) # Macの場合
draw = ImageDraw.Draw(overlay)
bbox = draw.textbbox((0, 0), text, font=font)
w, h = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(
(img.width - w - 20, img.height - h - 20),
text, fill=(255, 255, 255, 180), font=font,
)
out = Image.alpha_composite(img, overlay).convert("RGB")
out.save("photo_watermarked.jpg", quality=90)
fill の最後の数字(180)が透明度です。0で完全透明、255で完全不透明。半透明にすると上品な仕上がりになります。
ロゴ画像を透かしとして合成
photo.jpg にロゴ画像 logo.png を右下に重ねてください。ロゴサイズは元画像の幅の15%、透明度は50%にしてください。
from PIL import Image
base = Image.open("photo.jpg").convert("RGBA")
logo = Image.open("logo.png").convert("RGBA")
ratio = base.width * 0.15 / logo.width
logo = logo.resize((int(logo.width * ratio), int(logo.height * ratio)))
# 透明度を50%に
alpha = logo.split()[3].point(lambda x: int(x * 0.5))
logo.putalpha(alpha)
pos = (base.width - logo.width - 20, base.height - logo.height - 20)
base.alpha_composite(logo, pos)
base.convert("RGB").save("photo_logo.jpg", quality=90)
h2-6. トリミング・回転・反転
プロンプト例6:正方形クロップ
profile.jpg を中央基準で正方形にトリミングし、500×500pxにリサイズしてください。SNSのアイコンに使います。
from PIL import Image, ImageOps
img = Image.open("profile.jpg")
img = ImageOps.fit(img, (500, 500), Image.LANCZOS, centering=(0.5, 0.5))
img.save("profile_square.jpg", quality=90)
写真の自動回転(EXIF対応)
スマホ写真は撮影向きの情報(EXIF)を持っており、無視すると横向きになることがあります。
スマホで撮影した画像のExif情報を元に、正しい向きへ自動回転するスクリプトを書いてください。
from PIL import Image, ImageOps
img = Image.open("phone_photo.jpg")
img = ImageOps.exif_transpose(img)
img.save("phone_photo_fixed.jpg", quality=90)
たった1行ですが、これが入っているか否かで結果が大きく変わります。
h2-7. 高速処理:sharp(Node.js)を使う場合
数千枚規模の処理や、Webサーバー上での動的処理には sharp が向きます。
プロンプト例7:sharpで一括リサイズ
Node.jsのsharpを使い、inputフォルダの全画像を長辺1000pxにリサイズしてoutputに保存するスクリプトを書いてください。
import sharp from "sharp";
import { readdir, mkdir } from "node:fs/promises";
import path from "node:path";
const src = "input";
const dst = "output";
await mkdir(dst, { recursive: true });
const files = await readdir(src);
for (const f of files) {
if (!/\.(jpe?g|png)$/i.test(f)) continue;
await sharp(path.join(src, f))
.resize({ width: 1000, height: 1000, fit: "inside" })
.jpeg({ quality: 85 })
.toFile(path.join(dst, f));
console.log(`処理: ${f}`);
}
事前に npm install sharp が必要です。Pillowに比べて2〜5倍速く動くので、大量処理時の選択肢として覚えておきましょう。
h2-8. 実務に効く「複合処理」スクリプト
実務では、リサイズだけ・透かしだけ、という単機能では足りません。複数の処理を組み合わせた“仕上げ用スクリプト”を作るのが王道です。
プロンプト例8:3サイズ × 透かし入りの一括処理
products フォルダ内のすべての商品画像に対して、以下を一括処理してください:
1. 長辺1200pxのWeb用画像(透かしなし)
2. 長辺800pxのSNS用画像(右下に会社ロゴ logo.png を15%サイズで透かし)
3. 長辺400pxのサムネイル(透かしなし、WebP形式)
出力先はそれぞれ web/, sns/, thumb/ フォルダにしてください。
from PIL import Image, ImageOps
from pathlib import Path
src = Path("products")
for sub in ["web", "sns", "thumb"]:
Path(sub).mkdir(exist_ok=True)
logo = Image.open("logo.png").convert("RGBA")
for p in src.glob("*.jpg"):
img = Image.open(p)
img = ImageOps.exif_transpose(img)
# Web用
web = img.copy()
web.thumbnail((1200, 1200))
web.save(f"web/{p.name}", quality=88, optimize=True)
# SNS用 + 透かし
sns = img.copy().convert("RGBA")
sns.thumbnail((800, 800))
ratio = sns.width * 0.15 / logo.width
l = logo.resize((int(logo.width * ratio), int(logo.height * ratio)))
sns.alpha_composite(l, (sns.width - l.width - 16, sns.height - l.height - 16))
sns.convert("RGB").save(f"sns/{p.name}", quality=88)
# サムネ (WebP)
th = img.copy()
th.thumbnail((400, 400))
th.save(f"thumb/{p.stem}.webp", "WEBP", quality=80, method=6)
print(f"処理完了: {p.name}")
300枚の商品画像でも、数分以内に9種類の派生画像(3サイズ × 3用途)が完成します。ECサイト運営者にとっては、まさに革命的な時短です。
実践チュートリアル:商品画像300枚を15分でWeb用に変換する
最後に、本記事のテーマを総動員したチュートリアルです。
ステップ1: products フォルダを作り、対象画像(JPG/PNG)を全部入れる。会社ロゴを logo.png として配置。
ステップ2: ターミナルで該当フォルダに移動して claude 起動。
ステップ3: 次のプロンプトを順に投げる。
1. products フォルダの中身を見せてください。何枚ありますか?
2. 1枚をサンプルとして、サイズと向きを確認してください。
3. 全画像にEXIF回転補正を適用してください。
4. h2-8で紹介したような「3サイズ × 透かし入り」一括処理スクリプトを作って実行してください。
5. 出力後、各フォルダの画像枚数と合計ファイルサイズを表示してください。
実測で、300枚あたり10〜15分。マウスを動かす作業ではなく「指示を出して待つ」だけの作業に変わります。
FAQ
Q1. リサイズすると画質が悪くなります。改善方法は?
Image.LANCZOS などの高品質リサンプリングを指定し、保存時の quality を85〜90に上げると改善します。さらにJPGよりWebPを使うと、同等の画質でファイルサイズが小さくなります。
Q2. 透明背景のPNGをJPGに変換すると黒くなります。なぜ?
JPGには透明度の概念がないため、透明部分が黒くなります。img.convert("RGB") の前に白背景を合成すると、自然な見た目になります。bg = Image.new("RGB", img.size, "white"); bg.paste(img, mask=img.split()[3]) のように処理してください。
Q3. たくさんの画像を処理するとPCが重くなります。対策は?
一度にすべての画像をメモリに読み込まず、ループ内で開いて閉じる構造にしましょう。本記事のサンプルはすべてその方式です。それでも遅い場合は sharp への移行を検討してください。
Q4. EXIF情報(撮影日・GPS等)を残したい/消したいのですが?
残したい場合は img.save(..., exif=img.info.get("exif", b"")) のようにEXIFを引き渡します。消したい場合は何もしなければ大半のEXIFが除去されます。社外配布する画像はGPS情報の削除を必ず確認してください。
Q5. 動画ファイルも処理できますか?
Pillowは静止画専用です。動画は ffmpeg または moviepy の領域になります。「動画から1分ごとに静止画を切り出したい」といった処理は別の記事で扱います。
Q6. ClaudeCodeに画像を直接見せて編集してもらえますか?
画像の内容を分析する(「何が写っているか教えて」など)ことは可能ですが、編集自体はスクリプトを通じてPillow等で実行する形が安定しています。
Q7. 商用利用するときに気をつけることは?
(1) 自社で権利を持つ画像のみ処理する、(2) 透かしに使うロゴ・フォントのライセンスを確認する、(3) 顧客の写真など個人情報を含む画像は社内ルールに従う——この3点を守れば基本的に問題ありません。不安な場合はエンジニアまたは法務に相談してください。
まとめ
画像処理は、ルールさえ決まれば最も自動化しやすい業務の1つです。本記事では、Pillowを中心に、リサイズ・形式変換・透かし・トリミング・回転・一括処理までを実演しました。重要な観点は、(1)1枚ずつではなくフォルダ単位で考える、(2)EXIF回転や透明度処理など“地味だが大事な”項目を忘れない、(3)Web用・SNS用・サムネ用などの“派生バージョン”をまとめて生成する——この3点です。本記事のスクリプトを下敷きに、自社の用途に合わせて少し調整するだけで、毎週何時間もの作業が削減できます。今日から、画像処理は「Photoshopで1枚ずつ」ではなく「ClaudeCodeに頼んでフォルダごと」に切り替えていきましょう。
関連記事
- ClaudeCodeとは何か?基本の理解
- ClaudeCodeの初めての使い方
- ClaudeCodeのプロンプトのコツ
- ClaudeCodeでPythonを使う方法
- ClaudeCodeでWeb開発を行う方法
- ClaudeCodeでスクレイピングを行う方法