2021/12/13公開
 リストPNG(List PNG)とは,画像フォーマットであるPNG形式を利用して固定長レコードデータを扱うためのフォーマットです.
 リストPNGはデータPNGの概念に含まれるものです.単体でも使用できるフォーマットですが,点群PNGのような派生フォーマットを作成して使用することもできます.

ファイルフォーマット

 ファイルフォーマットはウェブブラウザーで一般的に利用できる画像フォーマットであるPNG(Portable Network Graphics, ISO/IEC 15948:2004)を使用し,PNGのカラータイプはRGBが利用できる以下のいずれかを使用します.

データ型

 リストPNGでは個々の数値データを1つまたは複数のピクセルに変換して使用します.仕様上定義されるデータ型には以下の5種類があるほか,任意のデータ型を定義して使用することができます.
データ型ピクセル数
RGB1ピクセル
符号無し整数24ビット符号無し整数1ピクセル
48ビット符号無し整数2ピクセル
符号付き整数24ビット符号付き整数1ピクセル
48ビット符号付き整数2ピクセル
※このデータ型は画像ファイルとの入出力で使用するものです.RGBと整数のみですが,後述するように利用時に係数やオフセットを使用するので実際には小数も扱えます.
 RGBでは,1ピクセルのRGB値をそのままバイト列として取得します.
 24ビット符号無し整数では,1ピクセルのRGB値(r,g,b)から以下の式で値(v)を取得します.
v=216r+ 28g+b
 48ビット符号無し整数では,2つのピクセルのRGB値,第1ピクセル (r1,g1,b1)及び第2ピクセル(r2,g2,b2)から以下の式で値(v)を取得します.
v= 240r1+ 232g1+ 224b1+ 216r2+ 28g2+ b2
 24ビット符号付き整数では,1ピクセルのRGB値(r,g,b)から以下の式で値(v)を取得します.
r'= { r, (r<27) r-28, (r27)
v=216r'+ 28g+b
 48ビット符号付き整数では,2つのピクセルのRGB値,第1ピクセル(r1,g1,b1)及び第2ピクセル(r2,g2,b2)から以下の式で値(v)を取得します.
r1'= { r1, (r1<27) r1-28, (r127)
v= 240r1'+ 232g1+ 224b1+ 216r2+ 28g2+ b2
 不透明度を使用する場合は255(最大値)を指定することを推奨します.不透明度に0が指定された場合,そのピクセルを含むデータは無効値として扱います.

ピクセルの配置

 数値データを表す各ピクセルは画像内に通常のラスタースキャン順で配置します.すなわち,画像の左上端から開始してまず右方向へ配置し,右端に達したら1行下の左端に移動してまた右方向へ配置します.これを配置するデータが無くなるまで繰り返します.
 画像の末端部で配置するデータが存在しないピクセルの色は規定しません.

データ構造

 配置するデータはヘッダーとデータ本体からなり,この順で配置します.
 ヘッダーは省略可です.ヘッダーに使用するピクセル数は可変で,これをヘッダー長と呼びます.
 データ本体は,概念的には0個以上の固定長レコードからなり,レコード内の個々の数値データをカラムと呼びます.なお実際には,データ本体内はカラム毎に配置します.

ヘッダー

 ヘッダーは,タイプ,ヘッダー長,レコード数,カラム数,カラム定義リストなどのフィールドからなります.構造および配置順序は以下の通りです.
フィールド名ピクセル数データ型内容
type1RGBバージョンや派生タイプなど
R: リストPNGバージョン依存番号.リストPNG ver. 0.2では1を指定
G: 派生フォーマット識別子, 0:未定義,1: 点群PNGメインファイル
B: 派生フォーマットバージョン依存番号 (派生フォーマットで規定されます)
headerLength124ビット符号無し整数ヘッダー長(ピクセル数)
recordCount248ビット符号無し整数レコード数
columnCount124ビット符号無し整数カラム数
columnDefList不定カラム定義の並びカラム定義リスト
userHeader不定使用法は任意

カラム定義

 各カラム定義はcolumnInfoとcolumnOffsetの二つのフィールドをこの順で持つことができ,columnOffsetは使用しない場合は省略されます.
フィールド名ピクセル数データ型内容
columnInfo1RGB R:
(上位4ビット)カラムデータ型,0:未定義,1:RGB,2:符号無し整数,3:符号付き整数
(下位4ビット)カラムピクセル数, 範囲は1~2
G: オフセットピクセル数, 符号無し8ビット整数,範囲は0~2
B: 係数常用対数(符号付き8ビット整数),範囲は-128~127
columnOffset0~2符号付き整数オフセット値
(ピクセル数はcolumnInfoのカラムピクセル数で指定されます)

データ本体

 データ本体内は,カラム毎にピクセルが配置されます.カラムの順番はヘッダーのカラム定義リスト内の順番に一致させます.一つのカラム内の配置はレコード順に配置し,この順番はすべてのカラムで一致している必要があります.

取得値の復元

 各カラムから取得される整数値は,ヘッダーで指定されている係数常用対数とオフセット値を使用して,元データに復元して使用されます.
 係数常用対数は,座標値を割る係数の常用対数(10を底とする対数)を表します.例えばこの値が4の場合は,10000で割って元データに変換することを表し,元データの小数点以下4桁までが保持されていることになります.
 係数常用対数がf, オフセット値がsのとき,取得値v0(整数)から復元値vを求める変換式は以下のようになります.
v=(v0+s) /10f

派生フォーマットとカラム定義リストの使用

 派生フォーマットでは必ずしもカラム定義リストを使用する必要はありません.派生フォーマットによっては,一部のカラム定義が固定されいてヘッダー内での記述が不要であったり,本仕様の定義方法では十分なカラム定義ができない可能性もあります.そのような場合は,すべてのカラム定義でカラムピクセル数(Rの下位4ビット)のみを指定します.さらにユーザーヘッダーを使って,別の仕様で記述することも可能です.