toruのブログ

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

Windows版の Google Chrome は ディスプレイの Gamma を sRGB に限定している?

1. 背景と目的

  • 筆者は Windows版の Google ChromeYouTube を視聴する際の最適なカラーマネジメントの設定について調べていた
  • ディスプレイプロファイルを変更しながら動作確認をしていたところ、想定とは異なる動作を確認した
  • 原因を調べた結果、筆者は Google Chrome に「ある仕様」が存在していると考えた
  • その結論に至るまでに、筆者がどのような確認を行ったのか記録を残すことにした

2. おことわり

  • 本記事で扱う動画コンテンツは YouTube の推奨エンコード設定[1] を参考とした BT.709 のコンテンツとします
  • 本記事に登場する sRGB の用語は原則として Gamma 特性としての sRGB を指します
    • 色域に関して sRGB の用語を使うのは極力避け、代わりに BT.709 を使います
    • 理由は sRGB と書いたときに、それが Gamma を指すのか色域を指すのか分からなくなることを避けるためです

3. 結論

幾つかの検証を行った結果、筆者は WindowsGoogle Chrome には以下の仕様が存在すると推測する。

※1 繰り返しますが、あくまでも筆者の推測です。この推測が正しいと裏付ける公式の資料はありません(筆者は見つけられていません)

図1. sRGB のディスプレイしか正しい表示にならない?

4. 結論に至るまでの道筋

4.1. 発端: YouTube を視聴する際のカラーマネジメント設定について

冒頭でも述べたが、もともと筆者は Google ChromeYouTube を視聴する際のカラーマネジメント設定について調べていた。 当初の予定では、調査は直ぐに完了して快適な YouTube 視聴ライフを過ごせるはずだった。 しかし、調べていくうちに Google Chrome の挙動で不可解な点が出てきた。

以下で筆者が調査した内容について述べていく。が、まず始めにカラーマネジメントの簡単な説明をしておく。

4.1.1. Webコンテンツのカラーマネジメントについて

現在の Web コンテンツには、テキストだけでなく静止画や動画も含まれている。 これらのコンテンツを正しい色でディスプレイに表示するためには、カラーマネジメントの仕組みが必要である。

カラーマネジメントを行うためには、静止画ファイル、動画ファイル、そしてディスプレイの色情報をそれそれ取得する必要がある。 色情報は以下で取得できる。

  • 静止画: 画像に埋め込まれた ICC Profile
  • 動画: メタデータとして埋め込まれた CICP [2]
  • ディスプレイ: OS に登録した[3] ディスプレイのプロファイル (ICC Profile)

カラーマネジメント対応の Webブラウザでは、これらの情報を使用してカラーマネジメントを行っている (※2)。

図2. カラーマネジメントの概要。CMM は Color Management Module の略。

※2 Google Chrome が CICP を参照するのは 過去記事 で確認済みですが、他のブラウザが参照しているかは不明です。そのうち調査したい…。

4.1.2. Google Chrome の 動画のカラーマネジメントに関する不思議な挙動

前項の内容を踏まえると、Webコンテンツを正しい色で表示をするには、動画、静止画、ディスプレイのそれぞれに対して ICC Profile と CICP が設定されていれば問題なさそうである。 実際、静止画に関しては目視レベルでは問題なかった (※3)。その一方で動画に関しては昨年の調査で奇妙な挙動を確認した[4]。

※3 実際は問題があったのだが、この時はまだ気づいていなかった

trev16.hatenablog.com

それは Google Chrome は SDR動画のカラーマネジメントを行う際にディスプレイプロファイルを無視する点である。

例を以下の図3、図4 に示す。

図3 はディスプレイのプロファイルとして ACES AP0 (※4) を指定した場合の YouTube 動画 [5] のスクリーンショットである。 図4 は比較用にディスプレイプロファイルとして BT.709色域 (sRGB色域) を指定した場合のスクリーンショットである。

※4 色域は ACES AP0 だが Gamma (TRC) は sRGB とした(色が薄く表示される挙動を確認したかったため)

図3 はディスプレイプロファイルとして非常に広い色空間を指定しているため、通常はあらゆる色が薄く表示されるはずである。実際、YouTube のロゴやサムネイルなどの静止画色が薄く表示されている。一方で、動画に関しては 色が薄く表示されていない。このことから、動画コンテンツに関してはディスプレイの ICC Profile が無視されていることが分かる。

説明 画像
図3. ACES AP0 のディスプレイプロファイルを設定
図4. BT.709 (sRGB) のディスプレイプロファイルを設定

従ってその調査では結論として、YouTube の 動画を正しく再生するためには BT.1886 でハードウェアキャリブレーションされたディスプレイが必要だと述べた(記事中では少し違うニュアンスで書いたが…)。

4.1.3. Google ChromeYouTube を視聴する際の最適な設定案と動作確認

前項の内容により、Google Chrome は静止画に対してはディスプレイプロファイルを考慮したカラーマネジメントが働くが、動画に対してはカラーマネジメントが正しく働かないことが分かった。 そのため、筆者は YouTube を視聴する際の最適な設定は以下だと考えた。

  • ディスプレイ
    • Gamma: 2.4 (BT.1886 準拠)
    • Gamut: BT.709
    • White point: D65
  • ディスプレイプロファイル
    • 上記3点を理論値ベースで記述した ICC Profile

この設定で問題が無いことを確認するために、以下のテストパターンを静止画と動画で作成した。

なお、テストパターンの詳細については別記事[6] に書いたので必要に応じて参照して欲しい。

trev16.hatenablog.com

  • 静止画のテストパターン

zu2 図5. 静止画の sRGB と Gamma 2.4 の判別パターン。画像には Gamma 2.4 の TRC の ICC Profile を埋め込んだ。

  • 動画のテストパターン

筆者は、Google Chrome が以下の動作をすれば静止画と動画のパターンの見え方は一致する と考えていた。

  • 静止画: 静止画のプロファイルとディスプレイプロファイルが同一のため 色変換せずに 表示する
  • 動画: ディスプレイプロファイルを無視して 色変換せずに 表示する

しかし、結果は異なっており静止画は Google Chrome によって色変換されていた。 結果的に静止画の左側のチェッカーボードは黒潰れが発生した(本来は 0 CV と 6 CV のパターンが見える)。

4.2. 調査: 静止画に対するカラーマネジメントの調査

前節で述べた通り、Google Chrome の静止画に関するカラーマネジメントの動作は想定と異なっていた。 そこで追加調査を行うことにした。

4.2.1. 調査の方針

まず、どのような方針で調査をするかを考えた。ひとまず以下の手順で調べることにした。

  • ① 図6 の 入力側 (a)、出力側 (b) のどちらで問題が発生しているか確認する
  • ② 具体的な原因を推測する

図6. 入力側を (a)、出力側を (b) とした様子

調査には 図7 に示すテストパターンを使用した。

zuzuzu 図7. Google Chrome のカラマネ調査用のパターン

このパターンは上下で大きく2つに分けられる。画面上部の Gamma 特性確認用パターンと、画面下部の色再現性確認用パターンである。

画面上部は 0 CV から 255 CV までのパッチがブロック状に並んでいる。 画面下部は RGBMYC の Primary Colors と Secondary Colors、更に ColorChecker のパッチが並んでいる。

調査の際は Google Chrome 上で上記のテストパターンを表示し、そのスクリーンショットを撮って Google Chrome がどのように色変換を行ったのかを確認した。 具体的にはスクリーンショットを解析して 図8 のグラフを作成した。

図8. Google Chrome の色変換の分析の例

グラフの左側は Gamma特性の理論値 (Reference) とスクリーンショット (Measured) の比較である。 グラフの右側は 色精度の理論値 (Reference) とスクリーンショット (Measured) の比較である。

理論値の計算および実測値のグラフへのプロットは、画像の ICC Profile の情報とディスプレイプロファイルの情報から EOTF/OETF と 3x3 Matrix を使って計算した。具体的な計算式は省略する (※5)

※5 記事が異様に長くなってしまうので計算式は省略します。何卒ご容赦下さい。

最後に検証に使用した ICC Profile について説明しておく。今回は以前の記事で自作した ICC Profile を使用した。 バージョンは v4.3、Gamma (TRC) は parametricCurveType で数式を指定した。例として BT.709色域、Gamma 2.4 のプロファイルを ICC Profile Inspector で開いた様子を 図9、図10 に示す。

図9. Header Info と Tag Table 図10. gTRC のようす

4.2.2. 調査①: 入力側の問題か出力側の問題かの切り分け

まず (a) 側の確認を行った。入力となるテストパターン画像の ICC Profile を以下の通りに変化させた。

  • 色域: BT.709、Gamma: sRGB
  • 色域: BT.709、Gamma: 2.4
  • 色域: ACES AP0、Gamma: 3.5

確認のために (b)側のディスプレイプロファイルは BT.709色域、sRGB の Gamma に固定した。

結果を以下に示す。

画像の色域 画像の Gamma 結果
BT.709 sRGB
BT.709 2.4
ACES AP0 3.5

理論通りに変換が行われており問題なかった。ACES AP0 色域のデータのみ ColorChecker で誤差が大きくなっていたが、これは 8 bit 画像であることに起因する量子化誤差が原因だと考える。

続いて (b) 側の確認を行った。出力となるディスプレイプロファイルを以下の通りに変化させた。

  • 色域: BT.709、Gamma: sRGB
  • 色域: BT.709、Gamma: 2.4
  • 色域: ACES AP0、Gamma: 3.5

確認のために (a)側の ICC Profile は BT.709色域、sRGB の Gamma に固定した。

ディスプレイプロファイルの色域 ディスプレイプロファイルの Gamma 結果
BT.709 sRGB
BT.709 2.4
ACES AP0 3.5

結果を確認すると理論値とは異なる結果が得られた。この結果から (b)側で問題が起きていると判断した。

4.2.3. 調査②: 具体的な問題箇所の特定

先ほどの (b)側の結果を確認するとディスプレイプロファイルの Gamma を sRGB 以外に設定した場合に異常となっている。 その一方でディスプレイプロファイルの色域に関しては BT.709色域 (sRGB色域) 以外を指定した場合に異常となっているかは不明である。

そこで追加調査として、以下のディスプレイプロファイルで確認を行った。

  • 色域: ACES AP0、Gamma: sRGB
  • 色域: ACES AP0、Gamma: 3.5

スクリーンショットを解析した結果は以下の通り。

ディスプレイの色域 ディスプレイの Gamma 結果
ACES AP0 sRGB
ACES AP0 3.5

結果を見ると Gamma が sRGB の場合は問題が無かった(8 bit 精度に起因する量子化誤差はあるが、これは (a)側でも存在したので無視する)。 従って、Google Chromeディスプレイプロファイルの色域に対しては正しく変換を行っていると推測する。

検証結果を改めて整理する。ディスプレイプロファイルの Gamma と色域を変化させて Google Chrome の出力を確認したところ、以下のことが分かった。

  • ディスプレイプロファイルの Gamma を sRGB 以外に設定すると理論値とズレる
  • ディスプレイプロファイルの 色域を BT.709色域 (sRGB色域) 以外に設定しても理論値とはズレない

この段階で筆者は、Google Chrome は「ディスプレイプロファイルの Gamma を sRGB に固定してるのでは?」と推測するようになった。 (b) 側の検証結果で左側の実測値が直線となっていることから、その可能性が極めて高いと考えた。

そこで、この推測が合っていることを確認するために以下のプロファイルを使用して追加検証を行った。

  • (a) 側の画像のプロファイル

    • 色域: BT.709
    • Gamma: 2.4
  • (b) 側のディスプレイプロファイル

    • 色域: BT.709
    • Gamma: 2.4

入出力が同じなので、Gamma 特性には何も変化が起こらないはずである。 が、もしも Google Chrome がディスプレイプロファイルの Gamma を sRGB に固定化しているなら、 Gamma特性は 2.4 to sRGB 変換が適用された曲線になるはずである。

結果は以下となった。

グラフ左側の Gamma特性は Gamma 2.4 to sRGB (空色の点線のプロット結果) した結果と一致した。

4.3. まとめ

最後に長々と書いてきた内容をまとめる。

  • Google Chrome の静止画の色変換で想定と異なる挙動を確認した
  • 図6 の 入力側 (a)、出力側 (b) についてそれぞれ調査したところ、(b) 側に異常があった
  • さらに詳しく調べると、ディスプレイプロファイルの Gamma (TRC) を 2.4 に設定しても、Google Chrome は sRGB とみなして色変換していた

以上の結果から筆者は Google Chromeディスプレイプロファイルの Gamma を sRGB に固定化していると考えるに至った。

5. その他

  • 今回検証に使用したディスプレイプロファイルの TRC は parametricCurveType で指定した。LUT Type だとどうなるかは未確認
  • macOS だとどうなるかは未確認。何となくだが上手く変換してくれそうな印象がある(macOS版は動画もカラマネされるし)

6. 感想

結局、私はディスプレイの設定をどうすればいいんだ。YouTube を見るときだけ 2.4 にして、それ以外は sRGB にすればいいのか?メッチャ面倒くさい……。

Firefox にカラマネを Off にできる拡張機能 [7] があるらしいので使ってみようかしら。

7. 付録

検証に使った環境とデータ類の一部を以下に列挙します。必要に応じて参照下さい。

7.1. 環境

項目 バージョン 備考
OS Windows 11 Pro 21H2 Build 22000.556
Chrome 99.0.4844.74 -
GPU 472.47 GeFoorce RTX 3070

7.2. テストパターン画像と ICC Profile

Profile の色域 Profile の Gamma 画像 Profile
BT.709 2.4 zu2 自作 Profile
BT.709 2.4 zu3 https://www.color.org/rec709.xalter
ACES AP0 3.5 zu4 自作 Profile
BT.709 sRGB zu5 自作 Profile

7.3. スクリーンショット解析のソースコード

コメント全く書いてないですし、自作ライブラリも使ってるので他の環境では動かないと思いますが、一応リンクだけ貼っておきます。

github.com

参考資料

[1] YouTube Help, "Recommended upload encoding settings", https://support.google.com/youtube/answer/1722171

[2] Wikipedia (EN), "Coding-independent code points", https://en.wikipedia.org/wiki/Coding-independent_code_points

[3] Microsoft, "About Color Management", https://support.microsoft.com/en-us/windows/about-color-management-2a2ed8fa-cf09-83c5-e55c-d1428519f616

[4] toru のブログ, "Google Chrome で動画を再生した際のカラーマネジメントに関する簡単な調査", https://trev16.hatenablog.com/entry/2021/01/11/141051

[5] YouTube, "【Official】Pokémon Special Music Video 「GOTCHA!」 | BUMP OF CHICKEN - Acacia", https://youtu.be/BoZ0Zwab6Oc

[6] toru のブログ, "ディスプレイが Gamma 2.4 と sRGB のどちらで表示しているかを確認するテストパターンの試作", https://trev16.hatenablog.com/entry/2022/04/02/230246

[7] The Mozilla Blog, "Firefox Extension Helps Bring Movie Magic To Theaters Near You", https://blog.mozilla.org/en/products/firefox/extensions-addons/firefox-extension-helps-bring-movie-magic-to-theaters-near-you/