ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

BMP画像に保存された色の値を調べる

ガンマの理解のためにも、実際に画像に保存される色の値を調べたい時があります。

先日「Photoshopでリニアな状態で作業する」という記事を書いた後に気になったので、こちらのサイトの解説を参考に、Photoshopで保存したBMPの中身をバイナリエディタStirling」で調べてみました。

それから、ウェブ上で2進法を10進法に変換してくれるサイトはこちら。

2進数、8進数、10進数、16進数相互変換ツール

中間グレーのBMPを用意


実際にPhotoshopで50%グレーの画像を作成し、作業用スペースをsRGBに設定した状態のものとLinearに設定した状態のものとをそれぞれBMPで保存。

f:id:moko_03_25:20180506011455j:plain

f:id:moko_03_25:20180501012329j:plain

バイナリエディタBMPの中身を確認する


「Stirling」で開いてみると、どちらのBMPも「7F」で埋め尽くされています。
この7Fが色の値ですが16進数なので10進数に変換します。

f:id:moko_03_25:20180506010650j:plain

先ほどのサイトで調べてみると「127」と分かりました。
ちゃんと中間グレーの値がそのまま保存されています。

f:id:moko_03_25:20180506011717j:plain

また、バイナリエディタで確認した2つの画像の中身はヘッダ情報も含め完全に一致しており、Photoshop(CS6)からBMP保存時にはカラープロファイル情報のチェックボックスがグレーアウトしますが、これで実際に保存されていないことが確認できたのではないかと思います。

※1:ググってみて出てきた記事によると、BMPには一応カラープロファイルを埋め込める仕様になっているそうですが対応しているアプリケーションはほとんどないとのこと

※2:PhotoshopからだとPSDは当然ですが、JPEGも保存時にカラープロファイルを埋め込めるようで、Photoshopで開くと保存前と同じカラー設定が適用されますが「Stirling」で調べるとsRGBで保存したファイルとリニアで保存したファイルの差異が激しかったのでそっ閉じしました

つまりPhotoshop上でどのカラースペースで作業しても、ディスプレイへの出力結果が変わるだけで、画像自体の色の値には影響が無いことが分かります。

自分は最近までこのあたりモヤモヤしていたのですがこれでスッキリしました。

Color Check Tool


ついでに、画像の色の値を調べるツールをC#で作ってみました。
制作時間はデバッグ含め2時間くらい。
放り込んだ画像サイズに合わせてレイアウトを崩さず丁度良いウィンドウサイズに広げるのに少し手間取りました。。ソリューション一式をGitHubにアップしています。

GitHubこちら。Zipファイルはこちら。ライセンスはMITです。

f:id:moko_03_25:20180506012212j:plain

大きな枠内に画像をドラッグ&ドロップして放り込んだ後、画像内をクリックすると画像ファイルに保存されている色の値をツール右側に表示します。
※追記:PictureBox内で補間の入る拡大縮小をしたりなど加工していなければ画像に保存された値と同じ値が取得できているは思うのですが‥このあたり何か判明したらまた追記したいと思います

ツール上での表示自体はsRGBになっているのではないかなと。。

そして中間グレーのBMPファイルを作業用スペースがsRGBの状態で保存したものとリニアのものと放り込んで色の値を見てみたところ、どちらも「127」であることが確認できました。

f:id:moko_03_25:20180506012553j:plain

ちなみに前の記事のスナップショット画像を放り込んで左のsRGBのファイルの色の値を出してみると、127 ではなく 125 と出ました。JPEGでもBMPでも同様でした。

Photoshopの画面のスクリーンショットを取ってPhotoshopで貼り付けて保存すると色の値が少し下がる?(真っ白の場合は 255 → 254 になりました)

f:id:moko_03_25:20180506012546j:plain

以前からガンマについて検証する際に画像をスクリーンショットで保存したりブラウザで表示することに正確性があるのか色々と不安がありましたが、ガンマ2.2かリニアかが比較できれば良いと思うので気にするほどではないですかね。。