MJHD

エモさ駆動開発

UNIRASTをC#で実装してみる

UNIRASTという画像形式がある。

AirPrintなどで使われている形式のようで、Appleが独自開発をしたもののようだ。公式なドキュメントは見当たらないが、リバースエンジニアリングしたものがGitHub上にたくさん転がっていたので、それをC#で書き直してみた。

 

目標は、BMP形式から、URF(UNIRAST)形式へ相互変換できること。

UNIRAST

UNIRASTは、以下のようなフォーマットになっている。

 

github.com

 

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形式のファイルを生成することができる。

## ソースコード

https://github.com/mj-hd/AirPrint.NET