PNGへ書き出した瞬間、RAWと同じものではなくなる
RAWをプレビューして、PNGやJPEGへ保存できるようにすると便利です。メールで渡せますし、ブラウザで開けます。ただし、そこにあるPNGやJPEGは、元のRAWを別の拡張子へ名前だけ変えたものではありません。
RAWを読み、色を解釈し、表示できるRGB画像へ変換し、別の形式として保存した結果です。途中で行ったmatrixやrangeの解釈、10bitから8bitへの丸め、色差の戻し方は、PNGやJPEGの中では「表示用に作った絵」として固定されます。
この違いを意識しないと、「PNGで見た色が正しいからRAWも正しい」「JPEGを保存してあるから元のRAWは消してよい」といった判断につながります。検証では、元データ・読み方・人が見るための画像を分けておくほうが安全です。
本記事は映像テストパターン生成器シリーズの第3回です。シリーズ全体の目的は、導入記事で整理しています。前回の第2回では、ヘッダを持たないRAWへmanifestを添え、読み方と出力セットを残す理由を扱いました。
先に結論:三つは役割が違う
| 形式 | 主な役割 | 単体で読み方が分かるか | 検証での位置付け |
|---|---|---|---|
| RAW | 画素値を格納するペイロード | 多くのヘッダなしRAWでは分からない | 元データ。形式条件と組にする |
| PNG | 可逆圧縮された表示・配布用画像 | ファイル内の構造をデコーダーが読む | 条件を反映した確認画像として扱う |
| JPEG | 非可逆圧縮された表示・配布用画像 | ファイル内の構造をデコーダーが読む | 見え方や容量を確認する派生物として扱う |
PNG仕様は、可逆圧縮されたラスター画像のファイル形式を定義しています。1 JPEGという名前には複数の規格がありますが、一般に.jpgとして扱う画像は、元の画素を完全には保存しない非可逆圧縮を使う場面が多いものです。このため、この記事では「JPEG=画素値をそのまま照合する元データ」には置きません。
値・読み方・見え方を、別の層として置く
画像を扱うときは、次の三つを分けて考えると混乱が減ります。
- 値 — 各画素のRGB、またはY'・Cb・Crなどの数値
- 読み方 — 幅・高さ・成分順・bit深度・格納形式・range・matrix
- 見え方 — 読み方を適用し、画面や別形式へ出力した結果
RAWは、主に1の値を並べたものです。ヘッダなしRAWでは2をファイル本体に持たないため、manifestなどで補います。PNGやJPEGは、デコーダーが画像を取り出すための構造をファイル内に持ちますが、どの色空間・プロファイル・変換条件まで扱えるかは、作成側と利用側の組み合わせにも依存します。
ここで「PNGなら常に正しい」とは言いません。PNGが可逆なのは、そのPNGに入れた画素に対してです。RAWのY'CbCrをRGBへ変換してPNGへ保存したなら、可逆に残るのは変換後のRGB画像です。変換前のY'CbCrコード値、ビットの詰め方、色差プレーンの並びまでPNGから戻せるわけではありません。
RAWは、条件を外に出せる代わりに、単体では曖昧になる
RAWの利点は、変換や圧縮の前にある画素バッファを、そのまま扱えることです。たとえばRGB888、NV12、P010、v210のように、機器との受け渡しで必要になる格納方法を明示して出力できます。
一方で、.rawという拡張子だけでは何も確定しません。1920×1080というサイズでさえ、ファイル名やメール本文にしか残さなければ、別のRAWと混ざったときに失われます。第2回で扱ったように、RAWはmanifestとプレビューを同じ名前で置き、フォルダごと受け渡すのがこのシリーズの基本方針です。
sample-colorbar/
colorbar_ycbcr420_8bit_nv12_bt709_limited.raw
colorbar_ycbcr420_8bit_nv12_bt709_limited.manifest.json
colorbar_ycbcr420_8bit_nv12_bt709_limited.preview.png
この三つは同格ではありません。RAWが観測・比較の基準となる値、manifestがその読み方、PNGが人の確認用です。PNGを消してもmanifestがあればRAWを読み直せますが、RAWを消してPNGだけ残しても、格納形式を再検証する材料にはなりません。
記事で共通に使うcolorbar_ycbcr420_8bit_nv12_bt709_limitedは、192×144・Y'CbCr 4:2:0・8bit NV12・BT.709 limited rangeの公開サンプルです。RAWとmanifest、生成時のプレビューを基準にし、RawInspector(第6回で扱う自作のWPFビューアー)からPNG、JPEG、TIFF、BMP、GIFを書き出す場合も、「どの派生画像を見ているか」と元RAWを混同しないようにします。
PNGは、確認結果をそのまま残すのに向く
テストパターンの確認では、PNGは扱いやすい形式です。カラーバー、格子、斜めエッジ、線対のような人工パターンは、画素の境界がはっきりしているため、可逆なPNGで一度保存しておくと後から比較しやすくなります。
ただし、比較の対象を明確にします。
- RAWと同じ条件で復号できたかを見たいなら、manifestに従って復号したプレビューPNGを比較します。
- 同じPNGを再保存して変わらないかを見たいなら、PNG同士の画素値を比較します。
- RAWのpack/unpackが正しいかを見たいなら、PNGではなく、元のコード値へ読み戻して比較します。
最後の確認をPNGだけで済ませると、表示段階で同じ見た目になっただけなのか、格納したビット列まで正しいのかを区別できません。10bitの上位・下位詰めや、色差プレーンの配置は、PNGにした後では検査しにくくなります。
JPEGは、見え方を渡すには便利でも、検証条件を増やす
JPEGは写真や説明資料の配布には便利です。RAWやPNGより小さくなることが多く、閲覧環境も広いからです。RawInspectorでは、復号して画面へ出している絵をPNG・JPEG・TIFF・BMP・GIFとして保存できます。これはRAWを別形式へ変換する機能ではなく、現在の表示条件で作った派生画像を保存する機能です。
一方、細い線・急な色境界・規則的な格子は、JPEGの圧縮による変化を観察しやすい素材でもあります。ここで現れたブロック状の境界や色のにじみは、元のRAWや表示経路の不具合ではなく、JPEGにした結果である可能性があります。
そのため、JPEGを使うときは、次のように目的を分けます。
| 目的 | 使う形式 | 理由 |
|---|---|---|
| pack/unpackや成分順の検証 | RAW + manifest | 格納前後のコード値を追える |
| 復号・色変換の確認 | PNG | 表示用に作った画素を可逆に残せる |
| 資料への貼り付け・軽量な共有 | JPEG | 容量と閲覧しやすさを優先できる |
| JPEG圧縮の影響そのものを観察 | PNGを基準にしたJPEG | 圧縮前後を分けて比較できる |
JPEGを使わないという話ではありません。元の検証対象へJPEGの変化を混ぜない、という順番の話です。
書き出し時の条件も、検証条件の一部になる
「PNGへ保存」「JPEGへ保存」だけでは、後から同じ画像を再現できません。例えばRawInspectorの現行実装では、保存する絵は表示倍率や画素格子を含まず、復号した等倍の8bit画像です。さらに、選んだmatrix・range・成分表示・色差の戻し方は派生画像へ反映されます。
実装時点の既定・固定条件を、ここでは意図的に具体的に残します。別の画像ソフトや将来の版では同じとは限りません。
| 出力形式 | RawInspectorで保存する内容 | 検証で気を付ける点 |
|---|---|---|
| PNG | Deflate(zlib)の可逆圧縮、8bit RGBA | 復号後のRGB画像を可逆に残す。RAWのbit packingは残らない |
| JPEG | 品質75固定、4:2:0、8bit 3成分、ベースラインJFIF | 細線・格子・色境界では、JPEG保存時の色差間引きと圧縮が加わる |
| TIFF | LZW、8bit RGBA | 可逆だが、保存対象はRAWではなく復号後の表示画像 |
| BMP | 32bpp BI_RGB、無圧縮 | 容量を抑える用途には向かないが、単純な表示画像として扱える |
| GIF | 最大256色のパレット、LZW | 階調や多数の色を含む画像では、色数を落とす影響を分けて考える |
この表は画像形式の一般的な優劣ではありません。あくまで、記事執筆時点のRawInspectorが何を出力するかの記録です。出力設定を変更できるツールや別のライブラリを使えば、条件は当然変わります。
同じファイル名でも「いつ、何から作ったか」を残す
pattern.pngやoutput.jpgのような名前だけでは、元のRAW、manifest、表示条件が分かりません。派生画像を保存するときは、少なくとも元になったRAWと、表示に使った解釈を追えるようにします。
RawInspectorでは、manifestとは異なる表示条件を選んだときだけ、書き出し画像の名前へ条件を追加します。例えばmatrixをbt601へ変え、full rangeとしてY'だけを表示した画像なら、_bt601-full-Yのような識別子が付きます。manifestどおりに復号した既定の画像は、不要に長い名前にはしません。
RAWコピーにはこの識別子を付けません。表示条件を変えてもRAWのバイト列は変わらないためです。_bt601の付いたRAWが残ると「bt601へ変換したRAW」と誤解を生むので、派生画像と元RAWは名前の扱いも分けます。
ここで残すべきなのは、未測定の圧縮率や「JPEGは何%小さい」といった数値ではありません。再現したいなら、元RAW、manifest、派生画像、派生時に使った表示条件をひも付けることです。
次は、パターンを用途から選ぶ
RAW、manifest、PNG、JPEGの役割が分かれると、次に「何を入力に選ぶか」を考えられるようになります。色が違うならカラーバー、黒レベルならグレーステップ、色差や解像感なら線対やハッチ、位置ずれなら格子や円、といったように、崩れ方からパターンを選びます。
次の記事では、video-test-patternsで生成している実サンプルを使いながら、パターンの形と観測対象を対応付けます。アプリの使い方ではなく、どのパターンをどんな検証へ持ち出すかを主題にします。
ここで扱わないこと
- JPEG、H.264、H.265などの内部アルゴリズムや圧縮率の比較
- PNG/JPEGの全メタデータ・カラープロファイル仕様
- カメラRAWやDNGの現像処理
- RawInspector以外のソフトウェアにおけるJPEG品質設定の優劣
まとめ
- RAWは画素値のペイロード、manifestはRAWの読み方、PNG/JPEGは表示用に作る派生画像として分けます。
- PNGが可逆でも、RAWから表示用RGBへ変換する前の値や格納方法まで保存するわけではありません。
- JPEGは共有に使える一方、細線や格子では圧縮による変化が検証結果へ混ざることがあります。
- 元RAW・manifest・派生画像を関連付けて残せば、後から同じ前提で確認し直せます。


