UNIRASTという画像形式がある。
AirPrintなどで使われている形式のようで、Appleが独自開発をしたもののようだ。公式なドキュメントは見当たらないが、リバースエンジニアリングしたものがGitHub上にたくさん転がっていたので、それをC#で書き直してみた。
目標は、BMP形式から、URF(UNIRAST)形式へ相互変換できること。
UNIRAST
UNIRASTは、以下のようなフォーマットになっている。
TIFFに結構近い模様。
ファイルは、
"UNIRAST\0" 12byte (\0は0x00)
Page Count 4byte (ページ数)
から始まる。
この後、各ページが格納される。
各ページは以下のヘッダから始まる。
Bit Per Pixel 1byte (深度)
Color Space 1byte (なんだろ?)
Duplex Mode 1byte (両面印刷)
Quality 1byte (印刷クオリティ)
- 4byte
- 4byte
Width 4byte (横幅)
Height 4byte (縦幅)
DPI 4byte
- 4byte
- 4byte
それぞれのページ毎に形式の違うデータを格納できるよう。
そしてその後各ページのピクセルデータが続く。
ピクセルデータは、以下のような書式になっている。
Line Repeat Count 1byte (一行のピクセルデータを、何回繰り返すか)
PackBit 1byte (後述)
Pixel Data Bit Per Pixel分 (RGBが入る)
...
PackBit 1byte
...(PackBitとPixelDataが、右端まで続く)
Line Repeat Count 1byte
...(Line Repeat Countが、下端まで続く)
Line Repeat Countは、一行のピクセルデータを何回繰り返すかを表しており、たとえば3だった場合は、次から始まる一行のデータを4行繰り返す。
PickBitは、TIFFで使われているアルゴリズムのようで、この値により後に現れるピクセルデータの扱いが変わる。
0x00-0x7Fの場合、後に現れるピクセルデータを、PackBit+1回だけ繰り返す。
0x80の場合、その時点から右端までデータは空白になる。真っ白。
0x81-0xFFの場合、後に現れるピクセルデータを、PackBit - 0x80個そのまま取り出す。
以上でUNIRAST形式のファイルを生成することができる。
## ソースコード