写真を書き出し直したり WebP に変換したりしたあと、赤や空の青だけが少し色あせて見えることがあります。ブロックノイズが出ているわけでもないので、画質の問題とも言い切れません。調べてみると、ピクセルの数値はそのままで、その数値を「どの色の基準で読むか」を示す情報、つまり色プロファイルが抜け落ちているケースがありました。この記事では、色プロファイルとは何かを 1 枚の公開写真で確かめた手順と結果をまとめます。なお、スマートフォンと PC ではディスプレイ自体が表示できる色の範囲も違い、それも見え方の差の原因になりますが、そちらは測っていません。ここで扱うのはファイルの中の話だけです。
色プロファイルは数値の読み方を書いたメモ
画像の各ピクセルは赤・緑・青の 3 つの数値で保存されています。ただ、数値だけでは色は決まりません。身長を「170」とだけ書いても、単位がセンチなのかミリなのか分からなければ意味が変わるのと同じで、数値にはそれを読むための基準が必要です。その基準を示すのが色プロファイル(ICC プロファイル)で、「この数値はこの色空間で読んでください」とソフトに伝えるメモのようなものです。多くのソフトとウェブの既定は sRGB で、Display P3 や Adobe RGB はそれより広い範囲の色を表せます。Apple の開発者ドキュメントには、iPhone 7 以降のカメラで P3 の撮影ができると書かれています。範囲が広いぶん、同じ鮮やかな赤でも P3 では sRGB より小さな数値で記録されます。プロファイルが残っていれば P3 として正しく読まれ、消えると既定の sRGB として読まれて、色が薄くなるという仕組みです。
確かめた手順
使ったのは Wikimedia Commons にある CC0 の写真(iPhone 6 で撮影された空港の駐機場)で、2048×1536 に縮小しました。これを Pillow 11.3 の ImageCms と macOS に入っているシステムの ICC プロファイルで Display P3 に変換し、プロファイルを埋め込んだ JPEG(品質 92)を作ります。次に、そのファイルとピクセルがまったく同じで、プロファイルだけを持たないコピーを作ります。2 つを sRGB として表示したときの色を CIELAB に変換し、色差 ΔE76 と彩度の変化を計算しました。同じ手順を Adobe RGB (1998) でも行っています。
結果
Display P3 のほうは、プロファイルを外すと平均彩度が 16.6% 下がり、画像全体の平均色差は 1.83、95 パーセンタイルで 3.9 でした。平均だけ見ると小さく感じますが、変化は鮮やかな部分に集中していて、最も鮮やかな 5% のピクセルでは彩度が 15.3% 下がり、色差は約 5.4 ありました。尾翼の赤や空の青が変わる一方で、白い機体や灰色の地面、暗部はほとんど変わりません。Adobe RGB では平均彩度が 20.1% 下がり、色差 5 を超えるピクセルの割合は P3 の 1.7% に対して 7.4% でした。注意点として、この写真の色はすべて sRGB の範囲に収まっています。sRGB の外の色を含む広色域の写真で差がどうなるかは、今回のデータからは言えません。
途中で一つ引っかかったことがあります。プロファイルがあるかどうかを macOS の sips -g profile で確認したところ、プロファイルを外したコピーでも「sRGB IEC61966-2.1」と表示され、本当に sRGB を埋め込んだファイルと区別がつきませんでした。おそらくプロファイルがないときは既定値を表示しているのだと思いますが、確認はできていません。有無を確かめるなら、Pillow で開いて info に icc_profile が含まれるかを見るほうが確実でした。
書き出し直しで消える理由と、避け方
プロファイルはピクセルとは別にファイルに付いている情報なので、保存し直すたびに、そのツールが引き継ぐかどうかで結果が変わります。P3 の JPEG を既定の設定で保存し直してみると、Pillow 11.3 は JPEG と WebP、それに resize や thumbnail のあとの JPEG 保存でプロファイルが消え、PNG では残りました。保存時に元のプロファイルを icc_profile 引数で渡せば JPEG でも残ります。ffmpeg 7.1 は JPEG と PNG で残り、WebP で消えました。sips は PNG への変換、縮小、品質 60 での保存のいずれでも残りました。
普段できる対策は、なるべく元の写真から作業を始めること、別々のツールで何度も保存し直さないこと、そしてウェブで使う画像は処理の段階で色を sRGB に変換してから保存することです。プロファイルを削除するだけとは違い、変換はピクセルの数値そのものを sRGB の値に計算し直すので、後の工程でプロファイルが消えても sRGB として読めば色は変わりません。
