gazou-compressor.jp

EXIF/GPSを自動で削除:画像の“個人情報”を残さない運用(Windows/Next.js)

写真に残るGPS位置情報やデバイス情報は、うっかり公開すると足跡になります。SNSやメディアでは、アップロード前にEXIFを確実に剥がす仕組みを作るのが安全です。本記事は Windows/CI/Next.jsでの自動除去フローを提示し、画質や容量も両立させます。

先に結論(最短フロー)
  • まず exiftool -all=全メタ削除、必要な場合のみ一部を再付与。
  • PNGは oxipng --strip all、JPEG/WebPは -strip 相当で軽量化。
  • Node(Sharp)やPowerShell監視で置くだけ自動処理に。公開前に /compressor /compare で最終確認。

要点(TL;DR)

1. なぜEXIFを消すのか

スマホ写真にはGPS座標・撮影日時・端末IDなどが含まれます。SNSのサムネ用に縮小しても残ることがあり、 収集されると位置特定や行動パターン推定の材料になります。運用で“常に剥がす”を先に組み込みましょう。

2. 最短フロー(実務)

  1. 素材を監視フォルダに置く → 自動で EXIF/GPS を除去。
  2. PNGは oxipng、写真は magick -strip または Node(Sharp) で再エンコード。
  3. 公開前に /compare で画質差分、/compressor で容量を確認。

3. 実装レシピ(コピペOK)

3.1 まずは現状把握(何が残っている?)

// PowerShell / exiftool# 事前チェック(残っているメタを確認)
exiftool -a -s -G -n -XMP:all -IPTC:all -EXIF:all ".\samples\*.jpg"
exiftool -GPS* -a -s -n ".\samples\*.jpg"

3.2 exiftool で一括除去

// PowerShell / exiftool# 1) すべてのメタを削除(上書き)
exiftool -overwrite_original -all= ".\samples\*.jpg" ".\samples\*.png" ".\samples\*.webp"

# 2) 画像の向き(Orientation)だけ反映して上書き(回転ズレ防止)
exiftool -overwrite_original -n -if "$Orientation" -Orientation# -Orientation= ".\samples\*.jpg"

3.3 ImageMagickでstrip + 最適化

// CMD / ImageMagick (magick)# JPEG/PNG/WebPのメタデータとICCを整理して最適化(例)
magick input.jpg -strip -sampling-factor 4:2:0 -interlace plane -quality 82 output.jpg
magick input.png -strip PNG8:output.png
magick input.webp -strip -quality 82 output.webp

3.4 PNGはoxipngで可逆圧縮

// CMD / oxipng# PNGのメタデータ剥ぎ取り+圧縮(可逆)
oxipng -o 3 -Z --strip all -i 0 -a -v ".\samples\*.png"

3.5 Node(Sharp)で自動バッチ

// TypeScript / Node (Sharp)// Node(Sharp)でのバッチ:EXIF/GPSを除去して再エンコード
import fs from "node:fs/promises";
import path from "node:path";
import sharp from "sharp";

const IN = "samples";
const OUT = "out";

const targets = [".jpg", ".jpeg", ".png", ".webp", ".avif"];

await fs.mkdir(OUT, { recursive: true });
for (const name of await fs.readdir(IN)) {
  const ext = path.extname(name).toLowerCase();
  if (!targets.includes(ext)) continue;

  const inPath = path.join(IN, name);
  const outPath = path.join(OUT, name.replace(/\.(png|jpg|jpeg)$/i, ".webp"));

  const image = sharp(inPath, { failOnError: false });
  // .withMetadata() を付けない → メタデータは書き出さない
  const webp = image.webp({ quality: 82, effort: 4 });

  await webp.toFile(outPath);
  console.log("wrote:", outPath);
}

3.6 置くだけ監視(PowerShell)

// PowerShell# PowerShell でフォルダ監視 → 置いたら自動でEXIF除去(exiftool + oxipng)
$src = "$PSScriptRoot\in"
$dst = "$PSScriptRoot\out"
New-Item -ItemType Directory -Force $src | Out-Null
New-Item -ItemType Directory -Force $dst | Out-Null

$fsw = New-Object IO.FileSystemWatcher $src -Property @{IncludeSubdirectories=$true;EnableRaisingEvents=$true;Filter='*.*'}
Register-ObjectEvent $fsw Created -Action {
  Start-Sleep -Milliseconds 150
  $path = $Event.SourceEventArgs.FullPath
  if ($path -match '\.(jpe?g|png|webp)$') {
    exiftool -overwrite_original -all= "$path" | Out-Null
    if ($path -match '\.png$') { oxipng -o 2 -Z --strip all "$path" | Out-Null }
    Write-Host "stripped: $path"
  }
} | Out-Null

Write-Host "Watching $src (Ctrl+C to exit)"; while ($true) { Start-Sleep -Seconds 60 }

4. 応用と使いどころ

5. 公開前チェック

6. まとめ

EXIF/GPSの削除を標準化すれば、誤公開リスクを実務で潰せます。CLI/監視/CI/Nodeのいずれでも、 仕組みに落として人為ミスをなくすのがコツ。画像形式の最適化と合わせ、安定した品質・容量で配信しましょう。

FAQ(よくある質問)

画像形式の基本方針は?(写真/スクショ/透過)
写真は AVIF / WebP(画質80–85%目安)、UIやスクショはPNG / WebP Lossless、単色ロゴはSVGが基本です。 実装の詳細は srcset/sizes設計ガイド スクショ最適化 を参照してください。
圧縮しても画質を落とさないコツは?
実表示幅に合わせたリサイズ → 過大ダウンロードを防ぎ、srcset/sizes を 実描画幅に一致させます。画質は写真で 80–85% を起点に、ノイズやエッジを目視確認。 仕上げは /compare で Before/After を見比べるのがおすすめです。
CLSを悪化させない画像の置き方は?
すべての画像に width/height(または親に aspect-ratio)を与え、広告・埋め込みは 予約サイズを先に確保します。詳しくは CLSゼロ設計ガイド を参照。

公開:2025-08-31

gazou-compressor.jp 編集部

画像圧縮・変換・背景除去などの実践テクニックと、Webで“速く・軽く・崩さない”ためのノウハウを発信しています。

関連記事