Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Pillow fades a P3 photo, sharp clips it: picking the JPEG default per target

2026年11月07日に「Dev.to」が公開したITニュース「Pillow fades a P3 photo, sharp clips it: picking the JPEG default per target」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

画像変換ライブラリPillowとsharpは、広範囲な色を扱うP3画像をJPEGに変換する際、デフォルトの色の扱いが異なる。Pillowは色情報が失われ色が薄く見え、sharpはsRGBに変換するため高彩度色が失われる。これはライブラリの初期設定の変換方法が異なるためで、出力先に合わせ、色情報を保持するかsRGBに変換するかを選ぶべきだ。

ITニュース解説

画像を扱うシステムを開発する際、画像処理ライブラリがどのように色を扱うか理解しておくことは非常に重要だ。今回は、Pillowとsharpという二つの主要な画像処理ライブラリを使って、広範囲の色を表現できる「Display P3」という色空間で作成された画像を、Webで一般的に使われる「JPEG」形式に変換する際の挙動について解説する。この実験では、各ライブラリのデフォルト設定で変換した場合に、全く異なる結果になることが示された。これはライブラリのバグではなく、それぞれが異なる「ターゲット」(目的とする色の表現方法)を想定しているためだ。

テストでは、macOSのsipsコマンドで作成されたHEICファイルが使われた。このファイルはDisplay P3の色空間情報(P3プロファイル)を内部に持っていた。しかし、PillowもsharpもHEICファイルを直接読み込むことができなかったため、sipsを使って一度PNG形式にデコードされた画像が入力として使用された。このPNGファイルはP3の色情報とP3プロファイルを保持している。JPEGへの変換品質は両方とも90に設定された。

Pillowライブラリのデフォルトの挙動を見てみよう。Pillowでsave()メソッドを使ってP3画像をJPEGとして保存すると、P3の色情報はそのままJPEGファイルに書き込まれるが、肝心のP3プロファイルは含まれない。ICCプロファイルとは、画像がどのような色空間で記録されているかを示す情報で、これがなければ画像を見るアプリケーションは正しい色を判断できない。Webブラウザのような一般的な画像ビューアは、プロファイルが埋め込まれていないJPEG画像を、Web標準の色空間である「sRGB」として扱うのが一般的だ。そのため、P3で記録された鮮やかな色がsRGBとして解釈され、結果として色が薄く、彩度が低い「ウォッシュアウト」されたように見えてしまうのだ。特に鮮やかな赤などの色は、本来の色との差が大きくなる。さらに、画像の撮影日時やGPS情報といったEXIFデータもデフォルトでは失われてしまう。

一方、sharpライブラリのデフォルトの挙動はPillowとは逆のアプローチを取る。sharpはJPEGに保存する前に、まずP3の色情報をsRGB色空間に変換する。そして、変換されたsRGBピクセルデータのみをJPEGに書き込み、プロファイルもEXIF情報も削除する。この場合、プロファイルがないJPEGはsRGBとして扱われるため、sRGBの範囲内の色は比較的正確に表示される。しかし、問題はsRGBでは表現しきれないP3の鮮やかな色だ。これらの色はsRGBに変換される過程で、sRGBで表現できる最も近い色に置き換えられてしまう。これを「クリッピング」と呼び、色が潰れて鮮やかさが失われる結果となる。特にP3の鮮やかなオレンジのような色は、大幅に色が変化してしまう。

このように、どちらのライブラリもデフォルト設定では、P3の画像をJPEGに変換する際に色に関する問題を抱えることになる。これは、それぞれのライブラリが「どのような環境での利用を想定しているか」というデフォルトの「ターゲット」が異なるためだ。

では、開発者はどのようにこれらの問題を解決し、適切な画像処理を行うべきだろうか。重要なのは、JPEG画像を「どこで」「誰に」見せるか、つまり「ターゲット」を明確にすることだ。

もしJPEG画像が、カラーマネジメントに対応したブラウザやビューアで表示されるのであれば、P3プロファイルを画像に埋め込んでおくのが最善の方法だ。Pillowではicc_profile=オプションを使い、sharpではkeepIccProfile()オプションを使用することで、P3の色情報を正しく保持したままJPEGを保存できる。この方法であれば、P3で表現できる鮮やかな色も正確に表示され、sRGBの範囲内の色についても高い精度を保つことができる。しかも、プロファイル情報を追加してもファイルサイズはわずかしか増えない。

反対に、もしJPEG画像が、プロファイルを無視したり、アップロード時にプロファイルを削除してしまったりする可能性のあるサービスで利用される場合、P3プロファイルを埋め込んでも意味がない。このような状況では、画像をsRGBに変換し、sRGBプロファイルを埋め込んでおくのが安全な選択肢となる。sharpライブラリのwithMetadata()オプションは、画像をsRGBに変換し、さらにsRGBプロファイルとEXIF情報(GPS情報を含む)を埋め込んでくれる。もしP3の色情報とEXIF情報を両方保持したい場合は、keepMetadata()オプションが使える。ただし、ユーザーがアップロードした画像などでEXIF情報を残したくない場合は、P3プロファイルだけを保持しEXIFは残さないkeepIccProfile()のような組み合わせも考慮に入れると良いだろう。

今回の実験では、ImgIngというオンラインツールも試された。このツールはHEICをJPEGに変換する際に、P3プロファイル、撮影日時、GPS情報を保持しており、色のずれも非常に小さい結果を示した。これはP3プロファイルを保持するパスに近い挙動だと言える。

今回の測定では、Pillowとsharpのデフォルト挙動やオプション指定時の違い、ファイルサイズ、色のずれ(CIEDE2000という指標で色の違いを数値化したもの)が確認された。しかし、全てのシナリオがテストされたわけではない。例えば、iPhoneで撮影されたオリジナルのHEICファイルは、色空間の表現方法やHDRデータが今回のテストファイルと異なるため、Pillowの挙動が変わる可能性が指摘されている。また、画像にsRGBの範囲外の鮮やかな色が多数含まれる場合、Pillowのデフォルト設定による色のずれは今回のテスト写真よりも大きくなるだろう。さらに、特定のコンテンツデリバリーネットワーク(CDN)や画像アップロードサービスがプロファイルを削除するかどうかはテストされていないが、そのような状況を想定してsRGBへの変換とプロファイル埋め込みの選択肢が存在する。

これらのことから、システムエンジニアとして画像を扱う際には、単にライブラリのデフォルト設定に頼るのではなく、画像の「ターゲット」(用途や表示環境)を深く理解し、それに合わせて適切な色空間の管理とプロファイルの扱いのオプションを選択することが極めて重要だとわかる。色空間とプロファイルの知識は、ユーザーに正確な色を届けるために不可欠な要素なのだ。

関連コンテンツ

関連IT用語