gazou-compressor.jp

画像形式変換パイプライン:ICC/EXIF/回転/透明の整備

画像最適化の多くの事故は EXIF/ICC/Orientation/透明 の取り扱いに起因します。本稿は素材の取り込みから 正規化 → 形式変換 → 圧縮 → 配信 → 検証 までをひとつのパイプラインとして設計し、色ズレ・回転ミス・フリンジ・容量の後戻りをなくします。

先に結論
Web配信は sRGB固定Orientationは画素へ適用してEXIFは削除、透明はマットを入れない。形式は 用途別に AVIF/WebP/PNG/JPEG を選定し、srcset/sizes優先度設計 を併用。

要点(TL;DR)

背景:色ズレ/回転/フリンジ/容量の四重苦を断つ

スマホ撮影の HEIC/広色域、EXIFの回転、半透明ロゴ、そして過去資産の混在…。単発の“最適化コマンド”では根治できません。最初に正規化の入口を設け、形式変換と圧縮を“同じ土俵”で行えるようにします。

この設計は sRGB固定の色パイプラインHEIC変換フロー透過縁対策 の要点を束ねています。

設計:取り込み→正規化→変換→圧縮→配信→検証

  1. 棚卸し — 拡張子/ICC/EXIF/Orientation/アルファ/ビット深度をスキャン。
  2. 正規化 — Orientation適用、ICCをsRGBへ、EXIF/ICCの不要タグを削除。
  3. 形式選定 — 写真=AVIF/WebP、イラスト/ロゴ=PNG/AVIF(lossless)。
  4. 圧縮 — Q/chroma/解像度を“観察→微調整→差分検証”で決定。
  5. 配信 — 指紋付きURL+immutable、準静的=SWR、srcset/sizes 設計。
  6. 検証 — SSIM/VMAF/ΔE/差分PNG、Retina/非Retina、ライト/ダークで最終確認。
HowTo JSON-LD
このページは手順を HowTo として構造化しています。検索結果での理解促進と、社内ナレッジの再利用性が向上します。

実装:EXIF/ICC正規化と安全な書き出し

libvips(Sharp)は 高速・低メモリ で正規化と書き出しを一括処理できます。EXIFのOrientationは必ずピクセルへ適用し、EXIFタグ依存を排除します。

// Sharp (libvips) での正規化と書き出し例(Node)
import sharp from "sharp";

await sharp("input.jpg")
  .withMetadata({ orientation: undefined }) // 以降の rotate で画素に適用、EXIFのtagは消す
  .rotate()                                 // EXIF Orientation をピクセルへ反映
  .toColorspace("srgb")                     // 広色域→sRGB 変換(埋め込みICCに従い変換)
  .flatten({ background: { r: 0, g: 0, b: 0, alpha: 0 } }) // 透明はそのまま、背景マットを入れない
  .webp({ quality: 85, effort: 4 })         // 写真向けにWebP (lossy) 出力
  .toFile("out.webp");

// 透過を保つ場合(ロゴ/アイコン)
await sharp("logo.png")
  .toColorspace("srgb")
  .avif({ quality: 60, effort: 4, lossless: false }) // 透明+少色なら AVIF/PNG を比較
  .toFile("logo.avif");

メタの検査やバッチ削除は exiftool が便利です(取り扱い注意:ソースの保管コピーで実行)。

# exiftool でのメタ確認と削除(Windows PowerShell)
exiftool -a -G1 -s input.jpg | Select-String "Orientation|ICC|ColorSpace"

# Orientationを画素に適用後、EXIFを完全削除(ソース保管用コピーに限定)
exiftool -overwrite_original -Orientation#= input_rotated.jpg
exiftool -overwrite_original -all= input_rotated.jpg

形式の使い分け:AVIF / WebP / PNG / JPEG

決め方の全体像は WebP/JPEG/PNGの使い分け次世代形式戦略 を参照。

配信:Cache-Control/immutable/SWR/ETag

ファイル名にハッシュ(指紋)を付け immutable を適用。差し替えがある準静的は s-maxage + stale-while-revalidate で“切れ目”を隠します。詳細は キャッシュ設計ガイド を参照。

# Cache-Control の例(CDN配信)
Cache-Control: public, max-age=31536000, immutable  # 指紋付きURLにのみ適用

# 差し替えがあり得る準静的画像
Cache-Control: public, max-age=300, s-maxage=86400, stale-while-revalidate=600

検証:差分/SSIM/ΔEと“見た目”の両輪

ロッシー変換では SSIM/VMAF差分ヒートマップ をセットで。色は ΔE、透明縁はライト/ダーク背景での視認チェックを必ず行います。CIでの自動化は ビジュアルリグレッション を参照。

NG/落とし穴

公開前チェックリスト

まとめ

“壊れない最適化”の鍵は正規化→変換→配信→検証を一つの連続体にすること。この記事のテンプレをベースに、組織の素材/配信要件へ合わせてカスタマイズしてください。

FAQ

FAQ(よくある質問)

1どの形式を優先すべき?

写真は AVIF/WebP(互換が必要ならJPEGも残す)。ロゴ/スクショ/イラストは PNG/AVIF(lossless) を比較。透明と小サイズはPNGが強いケースも。

2ICCタグは残す?

配信は sRGB固定 が基本。タグは省略可ですが、制作フロー上の検証には sRGB の明示が役立つ場合もあります。

3透過縁のにじみを避けるには?

Premultiplied/Unassociated の混在を避け、背景マットを入れずに出力。透過PNGのフリンジ対策を参照。

gazou-compressor.jp 編集部

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

関連記事

トピック/更新日の近いコンテンツ