toruのブログ

月1くらいで記事書きたい。

iccXML を利用した ICC profile の作成

背景

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 を作成することに成功した
  • ChromePhotoshop で簡易動作確認したところ特に問題なく動いた
    • 下図で作成した ICC profile が Chrome で扱われる例を示す(Google Chrome でご確認下さい)
      • (a) は ICC profile が無しの画像ファイル(色が異常)
      • (b) は作成した ICC profile を画像に埋め込んだファイル(色が正常)
    • 画像ファイルの詳細は本記事の後半で解説する
(a) (b)
Chrome で作成した ICC profile が扱われる例。(a) は profile無し。(b) は profile 有り。

結論に至るまでの流れ

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
    • Preferred CMM type
    • Profile version field
    • Date and time
    • Primary platform
    • Device manufacturer ※1
    • Device model ※1
    • Profile creator ※1
    • Profile ID ※2
  • 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 も頑張って目視で確認した。

Profile header の 0x00 埋め確認の様子

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 機能を使用すると以下のようになった(①を押すと②が表示された)。

ProfileDump の Validate Profile 機能を使用した様子

"NonComplaint!" というメッセージが出てしまっているが、同様のメッセージは Adobe製 の Display P3 の ICC profile でも出ていたので 今回は気にしない ことにした。

ChromePhotoshop での動作確認

最後の確認として ChromePhotoshop で 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)
zu1 zu2
Chrome で作成した ICC profile が扱われる例。(a) は profile無し。(b) は profile 有り。

続いて Photoshop での確認について説明する。まず、 Gamma2.4_BT.709_D65 の特性を記した ICC profile を作成しOS にインストールした(Windows だと .icc ファイルを右クリックでメニューが出る)。次に Photoshop を起動して先ほど作成した (b) の画像を開いた後、プロファイル変換で下図の通りに Gamma2.4-BT709-D65 へと変換した。

Photoshop で自作の ICC profile を使ってプロファイル変換をする様子

プロファイル変換後の画像ファイルが下図の (c) である。そして念の為 ImageMagickICC profile を削除した画像ファイルが (d) である。(c) は Color Checker の表示であるし、(d) も (a) とは全く異なった絵となっているのでプロファイル変換は成功している、別の言い方をすると作成した ICC profile は Photoshop で正しく認識されたと考える※3。

※3 本来であれば各パッチの誤差を⊿E2000などで検証すべきなのだが、今回は簡易動作確認なので目視評価のみとした

(c) (d)
zu1 zu2
Photoshop にて ACES AP0 to BT.709 にプロファイル変換した例。(c) は profile有り。(d) は profile 無し。

付録

今回の作業で使用したソースやデータを参考までに添付しておく。例によって何か問題が起こっても保証しない。 またソースコードは筆者の Docker 環境でしか動作しないと思うので注意して頂きたい。

github.com

作成した .xml ファイルの例

  • Gamma2.4_BT.709_D65.xml
  • Gamma3.5_ACES-AP0_D65.xml

作成した .icc ファイルの例

  • Gamma2.4_BT.709_D65.icc
  • Gamma3.5_ACES-AP0_D65.icc

作成に使用したソースコード

  • icc_profile_calc_param.py
  • icc_profile_xml_control.py
  • debug_icc_profile.py

感想

念願の 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, "ImageMagickICC プロファイルを扱う #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