PNG ファイルに埋め込まれたガンマ値がいくつになってるのかを探る研究。
PNG 画像は、ガンマ値というものをファイル自身に埋め込むことができます。つまり、作成側アプリと表示側アプリの双方がこの埋め込みガンマに対応してれば、ガンマ補正がおこなわれて、その画像が作成された環境での「画像全体の明るさの印象」が閲覧者の環境でも再現できる、とゆーわけです。これも GIF に対する PNG の大きなアドバンテージ。
ぼくは Mac で絵を描いたり画像パーツを作ったりしてます。Mac ではディスプレイのガンマ値は ColorSync 機能によって可変なのですが、ウチは Mac の標準的な値の 1.8 にしてます。
PNG だからって別に必ずガンマ値を埋め込まなくちゃならないわけじゃないんだけど、もし埋め込むなら、この環境で作った証を示す値が埋め込まれなくちゃいけないわけっす。ヤヤコシー説明はとてもできないですけど (死)、具体的には 1/1.8 とゆー値がファイルに埋め込まれるです。(のハズ…)
よのなか PNG を表示できて、しかもこの埋め込みガンマに対応してるビューアやブラウザはあまたありますが (たとえば IE4.x/5.x)、じっさいどんなガンマ値が埋め込まれてるのかを知るツールってボクは見たことないんでつ…。Windowsにはあるんかな。
というのはですね、ガンマ値が埋め込まれてるのかそうでないかを知りたいし、埋め込まれてるならどんな値なのか知りたい時ってあるじゃないでつか。…あるんですよぅ(笑)
以前、困ったことがありまして。Photoshop 4 か 5 で保存した PNG 画像を、 IE で開くとやたらと暗かったりしたんですよよ…。こりゃなんぞおかしなガンマ値が埋め込まれてるんでないか?おかしな値だとしたら、どんな値なんだ?とか思ったんです。今、 PNG 画像作るときはたいがい Photoshop 5.5 の「Web用に保存」なんスけど、これなら経験則的にマトモなガンマ値が埋め込まれてるっぽいんだけど、確証はないし…(ぉぃぉぃ
…とゆわけで。どーにか埋め込まれてる値を知ろうと思って PNG の仕様書を調べたなりよ。
PNG の仕様書によると、ガンマ値が埋め込まれている時は、gAMAチャンクという場所に書かれてまっす。
PNGファイルの生バイナリデータの、「gAMA」につづく 4byte がソレです。作成環境ガンマをγとすると、(1/γ) * 100000 した16進数の値がここに格納されてます。
下図は娘娘飯店バナ〜を、Mac 用のバイナリエディタ HexEdit で開いたところ。「67 41 4D 41」が「gAMA」、それにつづく「00 00 D6 D8」が埋め込まれているファイルガンマ。
以下は中学生レベルの方程式の計算 (笑)
(1/γ) * 100000 =「00 00 D6 D8」 なので、 γ = 100000 /「00 00 D6 D8」 16進数の「00 00 D6 D8」は 10 進数で 55000 だから、 γ = 100000 / 55000 = 1.818...
とゆーわけで、娘娘飯店バナ〜はガンマ 1.8 の作成環境でつくられた、と明示されとるわけです。よかったよかった。
(もしかしたら、おもいっくそカンチガイしてる可能性もあるんで、もしマチガイに気付かれましたらゼシお知らせください〜〜…。)
以上の計算をイッキに行うための計算機を用意してみました。(JavaScriptです)
ゲンミツには、埋め込まれているファイルガンマ (1/γ) の逆数 γ が、単純に作成環境のガンマを表しているとは限らないんだろけど、単純に考えることにします。(爆)
下のスクリーンショットは、ぼくの友達 (Macユザ) が Photoshop 5.0 で作った、とある PNG 画像を HexEdit で開いたところ。
やっぱりガンマ 4.4 などとゆートンデモな値がうめこまれてるらしい…。IE でこれを表示すると、ガンマ 4.4 で作られたものとして扱われるので、Mac (ガンマ1.8)/ WIn (ガンマ2.2) のどちらでも本来より暗い表示になるです…。