JPEGやTIFFには、カラーマネジメントのためのプロファイルが埋め込まれることがあります。

カメラやスキャナなどでは、ハードウェアが取得できる色の幅が、装置によって決まっています。この色の幅は「色空間(カラースペース)」と呼ばれます。デジタルカメラやスキャナの中には、取得したデータに、色空間に関する情報、すなわちカラーマネジメントのためのプロファイルを埋め込むものがあります。

このプロファイルは、インターナショナル・カラー・コンソーシアムという標準化団体が規格を出していて、この規格に沿ったものは頭文字を取ってICCプロファイルと呼ばれたりします。

映像を取得する側もそうですが、映像を映し出すディスプレイや、映像を印刷するプリンタもこのプロファイルを持っています。特にプリンタは、光学的な3要素(赤・緑・青、RGB)を塗料の4要素(シアン・マゼンダ・イエロー、キーカラー=ブラック)に変換する必要から、このプロファイルを個別に持っています。たいていはプリンタドライバがこのプロファイルをシステムにインストールするようになってます。



さて、NP_MediaUtilsで利用しているPHPのGDライブラリ・バインディングは、PHPで標準的に使うことが出来る画像処理系です。が、画像からカラープロファイルを取り出す、画像にカラープロファイルを埋め込むといった操作ができません。

画像処理および作成 > 画像処理 (GD) php.net

そのため、MediumオブジェクトのgetResampledBinary関数でリサンプリングした画像は、元の画像のプロファイルを維持できませんし、隣接ピクセル間からリサンプリング後のピクセル値を算出する際に、カラープロファイルを考慮した計算ができません。

この性質は、NP_MediaUtilsに画像処理を依存しているNP_ImageLimitSizeに影響します。このプラグインは、アップロードされた画像をリサンプリングして保存しますが、前述のとおり、カラープロファイルやExif情報をカットします。そのため、リサンプリング後のデータを表示する場合、ブラウザがカラー・マネジメント・プロファイルに対応していても、色空間は標準的に使われているもの、おそらくsRGBが適用されてシステムの表示系に回されるかと思います。

なお、JPEGにはExif情報を含むものもありますが、PHPの処理系では、このExif情報を読み取ることは出来るものの、再設定することが出来ないようでした。そのため、リサンプリング後の画像にもExif情報を埋め込むというのは、PHPの標準的な設定では不可能です。

画像処理および作成 > Exif 関数 @ php.net

色空間の正確な再現やExif情報の埋め込みを望む方は、NP_ImageLimitSizeは使わずに、リサンプリングなどの処理をちゃんとしたデスクトップアプリケーションで行い、アップロードすることをおすすめします。

PHPの画像処理系には、GDライブラリバインディングの他に、ImageMagickライブラリ・バインディングやGmagickライブラリ・バインディング、Cairoライブラリ・バインディングが使えます。どれも強力な処理系ですが、PHPの標準的な設定では利用できません。そのため、このプラグインでの実装は見送っています。

画像処理および作成 @ php.net