背景
Gamut Mapping に関する勉強を進めるにあたり、Adobe CMM などの有名な CMM(Color management module) が内部でどのような変換を行っているか軽く調べようと考えた。しかし(本当に色々な人に怒られそうだが)自分は ICC profile に関する知識が非常に乏しく、直ぐには CMM の挙動を調査できない状況にあった。
そこで最初の一歩として、ICC profile の作成方法を調べて実際に作成してみることにした。
目的
- ICC profile を作る
- コンテンツ側の光源は D65 固定とする(もちろん PCS は D50)
- Gamut は任意の値を指定可能とする
- Transfer characteristics (ICC profile で言うところの TRC)は parametricCurveType で任意の値(γ=2.6 や sRGB など)を指定可能とする
- Profile class は Display device profile のみを対象とする。印刷系の事は何も考えない
結論
iccXML
というツールを使うことで好みの特性の ICC profile を作成することに成功した- Chrome と Photoshop で簡易動作確認したところ特に問題なく動いた
- 下図で作成した ICC profile が Chrome で扱われる例を示す(Google Chrome でご確認下さい)
- 画像ファイルの詳細は本記事の後半で解説する
(a) | (b) |
---|---|
結論に至るまでの流れ
ICC profile 生成ツールの調査
ICC の Webサイトを見ると SampleICC を使えば ICC profile が作れるようである[2]。 しかしソースコード一式を落としてドキュメントを読んでも作り方が分からず Sample ICC を使う方法は断念した(オイオイ)。
その後、色々とネット記事を見ていたところ以下の記事[3] が目に留まった。
https://www.it-swarm-ja.tech/ja/system-settings/%e3%82%ab%e3%83%a9%e3%83%bc%e3%83%97%e3%83%ad%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e5%90%8d%e5%89%8d%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%97%e3%80%81icc%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e4%bf%9d%e5%ad%98%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%82%8b%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%99%e3%82%8c%e3%81%b0%e3%82%88%e3%81%84%e3%81%a7%e3%81%99%e3%81%8b%ef%bc%9f/960965094/www.it-swarm-ja.tech
この記事では iccToXml
および iccFromXml
というコマンドを使って .icc ファイルと .xml ファイルの変換を行っている。
この iccFromXml
を使えば簡単に ICC profile が作成できると考えて利用することにした。
iccXML についての調査
ICC の Webサイトを見ると iccXML については以下のように書かれている[4]。
IccXml is a utility based on SampleICC/RefIccMax that converts an ICC profile to an XML encoding, and back from XML to a binary .icc file. Both source files and binary executables are included.
なるほど これは使えそうだ、と考えた。
iccXML のインストール
iccXML を使うには SampleICC および iccXML の双方が必要となる。前述の[3] の記事を参考に Ubuntu 20.04 でビルド&インストールを行った。
今回は以下の Dockerfile を利用してビルド&インストールした(ソースコードはSourceForge から DL した )。
FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ build-essential \ cmake \ autoconf \ libtool \ libxml2-dev \ libtiff5-dev RUN mkdir -p /root/local/src COPY SampleICC-1.6.8.tar.gz /root/local/src/ COPY IccXML-0.9.8.tar.gz /root/local/src/ RUN mkdir -p /work/src RUN cd /root/local/src \ && tar -xzf SampleICC-1.6.8.tar.gz \ && cd SampleICC-1.6.8 \ && ./configure \ && make -j8 \ && make install RUN cd /root/local/src \ && tar -xzf IccXML-0.9.8.tar.gz \ && cd IccXML-0.9.8 \ && ./configure \ && make -j8 \ && make install RUN echo "/usr/local/lib" >> etc/ld.so.conf \ && ldconfig RUN rm -rf /root/local/src \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*
雛形となるXMLファイルの準備
iccFromXml
では xml ファイルから .icc ファイルを生成する。.xml ファイルの中身は目的に応じて内容を書き換えるが、
まずは雛形となる .xml ファイルを1つ準備することにした。今回は Photoshop が生成する Display P3 の ICC profile を雛形とした。
雛形は以下の通りに作った。
まず、Photoshop で Display P3 のプロファイル付きの適当な PNG画像を生成した。次に、ImageMagick を使って PNG画像から ICC profile を分離した[5]。
convert display_p3_img.png display_p3.icc
続いて iccToXml
を使って .xml ファイルに変換した。
iccToXML display_p3.icc display_p3.xml
最後にエディタ上で .xml ファイルを編集して今回の作業では不要な Tag を削除した。 具体的には technologyTag を削除した。理由は technologyTag は Display device profile で mandatory の Tag では無かったからである。
Python を使った .xml ファイルの編集
さて、筆者は冒頭でも述べたとおり ICC profile のパラメータを色々と変更したいと考えている。
したがって ICC profile の元となる .xml ファイルを Pythonスクリプトで編集できることが好ましい。
そこで今回は Python の標準ライブラリである xml.etree.ElementTree
を利用して .xml ファイルの書き換えを行うコードを書いた。
具体的には以下の内容を任意の値に書き換える Python スクリプトを書いた。
- Profile header
- Tagged element data
- desc
- sprt
- chad
- lumi
- rTRC, gTRC, bTRC
- rXYZ, gXYZ, bXYZ
※1 個人制作の ICC profile であり使用しない領域なので仕様書に従って 0x00 で埋めた
※2 MD5値を入れる領域だが iccFromXml
コマンド実行時に計算されるため ここでは 0x00 で埋めた
.xml ファイルから .icc ファイルへの変換
Python スクリプトの吐き出す .xml ファイルを iccFromXml
コマンドを使って以下の通りに変換した。
iccFromXml target_profile.xml target_profile.icc
作成した ICC profile の確認
Chome や Photoshop などのアプリケーションで試す前に、作成した ICC profile が規格に準拠しているかの確認を行った。 労力を考慮して以下の方針で確認することにした。
- Profile header : バイナリエディタを使って頑張って目視確認
- Tag table : ICC が提供している
ProfileDump
[6] を使って確認 - Tagged element data : ICC が提供している
ProfileDump
[6] を使って確認
Profile header をバイナリエディタで確認した理由は、.xml ファイルで 0x00 に設定した Device manufacturer, Device model, Profile creator のフィールドが .icc ファイルでも 0x00 となっているか心配だったからである。結果としては以下の通り 0x00 となっていることが確認できた。 それ以外の Profile header も頑張って目視で確認した。
Tag table と Tagged element data は ProfileDump
の Validate Profile 機能を使って確認した。
ProfileDump
を使用した理由は ICC の Webページ[7]に以下の記載があったからである。
For convenience of users a compiled version of the Profile Dump utility is available. This will read the contents of an ICC profile and run the SampleICC validation routine to test for conformance with the current ICC specification.
なお、その近くに "Profile Dump does not test for conformance with all aspects of the ICC specification" とも書かれていたが、
あくまで個人用途の ICC profile であるため、今回は ProfileDump
だけで十分だと判断した。
Pythonスクリプトで作成した .xml ファイルから変換した Gamma2.4, BT.2020 の ICC profile に対して Validate Profile 機能を使用すると以下のようになった(①を押すと②が表示された)。
"NonComplaint!" というメッセージが出てしまっているが、同様のメッセージは Adobe製 の Display P3 の ICC profile でも出ていたので 今回は気にしない ことにした。
Chrome と Photoshop での動作確認
最後の確認として Chrome と Photoshop で Color Checker 画像を取り扱った。
最初に Chrome での確認について説明する。まず Gamma2.4_BT.709_D65 の ColorChecker を Gamma3.5_ACES-AP0_D65 に変換した。結果は下図の (a) の通りである。 当然だが普通の sRGB モニターでは異常な絵として表示される。
次に Gamma3.5_ACES-AP0_D65 の特性を記した ICC profile を作成し画像ファイルに埋め込んだ。結果は下図の (b) である。カラマネの働く Google Chrome で見ると正常な絵として表示される。これにより作成した ICC profile は Chrome で正しく認識されたと判断する。
(a) | (b) |
---|---|
続いて Photoshop での確認について説明する。まず、 Gamma2.4_BT.709_D65 の特性を記した ICC profile を作成しOS にインストールした(Windows だと .icc ファイルを右クリックでメニューが出る)。次に Photoshop を起動して先ほど作成した (b) の画像を開いた後、プロファイル変換で下図の通りに Gamma2.4-BT709-D65 へと変換した。
プロファイル変換後の画像ファイルが下図の (c) である。そして念の為 ImageMagick で ICC profile を削除した画像ファイルが (d) である。(c) は Color Checker の表示であるし、(d) も (a) とは全く異なった絵となっているのでプロファイル変換は成功している、別の言い方をすると作成した ICC profile は Photoshop で正しく認識されたと考える※3。
※3 本来であれば各パッチの誤差を⊿E2000などで検証すべきなのだが、今回は簡易動作確認なので目視評価のみとした
(c) | (d) |
---|---|
付録
今回の作業で使用したソースやデータを参考までに添付しておく。例によって何か問題が起こっても保証しない。 またソースコードは筆者の Docker 環境でしか動作しないと思うので注意して頂きたい。
作成した .xml ファイルの例
作成した .icc ファイルの例
作成に使用したソースコード
感想
念願の ICC profile 作成にひとまず成功した。今では Photoshop で生成した画像から ICC profile を奪い取る生活をしていたが、今後は自分が欲する任意の特性の profile を比較的簡単に作れそうであり良かった。
一方で PCS や Rendering Intent に関しては知識不足&経験不足な点が幾つもあるので、資料の熟読や各種CMMの動作確認を行って理解を深めていきたい。
参考資料
[1] International Color Consortium, "Specification ICC.1:2010 (Profile version 4.3.0.0)", http://www.color.org/specification/ICC1v43_2010-12.pdf
[2] International Color Consortium, "Profile viewing and testing resources", http://www.color.org/profileview2.xalter .
[3] it-swarm-ja.tech, "カラープロファイルの名前を変更し、ICCファイルに保存されているタイトルを変更するにはどうすればよいですか?", https://www.it-swarm-ja.tech/ja/system-settings/%e3%82%ab%e3%83%a9%e3%83%bc%e3%83%97%e3%83%ad%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e5%90%8d%e5%89%8d%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%97%e3%80%81icc%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e4%bf%9d%e5%ad%98%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%82%8b%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%99%e3%82%8c%e3%81%b0%e3%82%88%e3%81%84%e3%81%a7%e3%81%99%e3%81%8b%ef%bc%9f/960965094/ .
[4] International Color Consortium, "Open source tools", http://www.color.org/opensource.xalter .
[5] awm-Tech, "ImageMagick で ICC プロファイルを扱う #3 コマンド解説", https://blog.awm.jp/2017/08/06/imicc/
[6] International Color Consortium, "iccMAX - Reference implementation and test suite", http://www.color.org/iccmax/index.xalter#reficcmax
[7] International Color Consortium, "SampleICC Profile Dump utility", http://www.color.org/profdump.xalter