gazou-compressor.jp

ウェブ画像色プロファイル検査パイプライン:不一致検出と自動標準化

色ズレは “モニター差” や “閲覧者環境” の曖昧さに押し付けられがちですが、制作~配信工程で ICC プロファイルが混在 し、かつ 変換影響を測定していない ことが根因であるケースが大半です。特に P3 / AdobeRGB / 未埋込 / 破損ICC が同居すると、一部ブラウザは sRGB 仮定で解釈し彩度の過剰/不足やコントラスト圧縮を引き起こします。

本稿は CI での収集 → 自動解析 → ΔE 影響測定 → 判断ポリシー適用 → 最終標準化 を再現可能な 5 ステップに分解し、属人的 “目視OK” を廃止する最低限の判断装置を提供します。箇条書きはすべて 何を/なぜ/間違えるとどうなるか の 3 点セットで補足し読み応えを確保しています。

よくある失敗
デザインツール経由の一部バナーだけ P3 → 端末差で コーポレートカラーが揺れ ブランドチームから差し戻し → 再書き出し時間が潜在コスト化。

要点(TL;DR)

1. 背景:混在放置のコスト

ブランドカラーや UI コンポーネントの色は “可視的一貫性” がユーザの信頼感と可読性を支えます。ICC が混在すると ①レビュー環境での見え違い → 誤指摘②写真のみ彩度が過剰/不足 → トーン崩壊③運用後に気付いてリサイズ済みアセットを再生成 といった遅延コストが累積します。

さらに P3 を無秩序に許容すると CDN 側が想定外の色空間変換を行い(または行わず)差分再現性が失われ、ビフォー/アフター比較テストが不安定になります。従って “最小の例外集合” を定量で固定化することが持続的な QA を実現する要件です。

1.1 計測条件の最小セット

推奨ベースライン
明/中/暗 (L* 20 / 50 / 80 近傍) × 高彩度/中彩度 の 6 クラスタから各 150 ピクセル=計 900 サンプルで ΔE を近似。全画像 4K でも 10〜50ms 程度。

これ以上の全画素測定は“安心感”以外の価値が薄く、CI 時間を押し上げて文化的継続性を損ねるため意図的に行いません。測定の再現性>網羅性 を原則にします。

2. パイプライン全体像(詳細と失敗例)

  1. 収集 (diff scan) – Git 差分から対象拡張子 (jpg/png/webp/avif) を抽出。
    失敗例: リポジトリ全量を毎回走査 → CI 6分超 → 開発者がローカル実行を回避し品質退行。
  2. 解析 (metadata) – exiftool で ICC 名称 / primaries / profileID、sharp でビット深度。
    理由: プロファイル“無”と“sRGB埋込”は挙動が異なるブラウザがあるため統一判断には両方の識別が必須。
  3. 試算 (ΔE sampling) – sRGB へ仮変換後サンプリング差分。
    間違い: 全画素比較で時間肥大 / 乱数 seed 不統一で PR ごと値が揺れて議論がループ。
  4. 判定 (policy) – しきい値 > 対象画像のみ keep-P3 ラベル。
    過剰例: “写真は全部 P3” とすると UI アイコンだけ sRGB で統一感崩壊。
  5. 変換 (standardize) – sRGB + 意図的 ICC 埋込 + 再圧縮(品質プリセット統一)。
    誤り: strip のみ → 解析ツール再実行時に“未埋込”として再度候補化。
  6. レポ (persist) – JSON 差分 + HTML ヒートマップ。
    価値: 増減トレンドを時系列で可視化し“いつから崩れたか” を 30 秒で追跡。

3. ΔE 計測 & 変換スクリプト例

以下は擬似コード。実装では deltaE 関数を CIEDE2000 で実装し、サンプリングは明度ヒストグラムに基づき層化抽出します。ビット深度が 16 の場合は先に 8bit 量子化して統一条件で比較(深度差によるノイズを除外)。

// pseudo: profile-check.ts
import sharp from 'sharp';
import { deltaE } from './deltaE';

async function analyze(path: string) {
  const input = sharp(path);
  const meta = await input.metadata();
  // ... ICC 抽出 (meta.icc) 仮想
  const bufSrgb = await input.toColorspace('srgb').toBuffer();
  // サンプリングして ΔE
  return { path, profile: meta.icc ?? 'unknown', deltaEAvg: 1.2, deltaEMax: 3.9 };
}

4. 判定ポリシー設計(分類の理由とリスク)

5. CI統合ポイント(なぜこの順序か)

6. 可視化レポート要素(観点と得られる確証)

6.1 よくある誤判定と影響

7. 公開前チェック(観点+失敗時リスク)

8. まとめ

色管理は “ツールの話” ではなく 判断コスト最小化の仕組み設計 です。測定 → 一貫した閾値 → 例外最小化 → 可視化履歴 の 4 層を固めれば、規模拡大後も追加画像は数十 ms で品質評価できます。箇条書きそれぞれに “なぜ/どう失敗するか” を添付することで、暗黙知を文章化し新人オンボーディング時間を削減できます。

gazou-compressor.jp 編集部

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

関連記事

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