インターリーブド・ビットマップ(ILBM)は、インターチェンジ・ファイル・フォーマット(IFF)規格に準拠した画像ファイル形式です。この形式はAmigaプラットフォームで生まれ、IBM互換システムでは、この形式または関連するPBM(Planar Bitmap)形式のファイルは、1980年代後半から1990年代前半のゲームでよく見られます。これらのゲームは、Amigaへの移植版であるか、グラフィックアセットがAmigaマシンで設計されたものです。
このフォーマットの特徴は、ビットマップをインターリーブされたビットプレーンの形式で格納することであり、これがフォーマット名の由来となっています。これは、Amiga のグラフィック ハードウェアがメモリからグラフィック データをネイティブに読み取る方法を反映しています。PackBitsというシンプルな圧縮形式がサポートされており、ILBM ファイルをよりコンパクトにすることができます。[ 4 ]
Amigaでは、これらのファイルは特定のファイル拡張子に関連付けられていませんでしたが、拡張子が体系的に使用されるPCシステムで使用されるようになると、.lbmまたは場合によっては.pbmという拡張子が使用されるようになりました。
ILBMは、連続する複数のチャンクで構成されるIFFファイル形式の実装であり、その順序はある程度変更可能です。各チャンクは異なる機能を持ち、同じ基本形式を持っています。つまり、プログラムはファイル内のすべてのチャンクを読み取ったりデコードしたりする必要はなく、処理したいチャンクまたは理解できるチャンクだけを読み取ればよいのです。[ 4 ]
ILBMファイルには通常、画像サイズ、パレット、ピクセルデータなど、画像編集プログラムで表示するために必要な情報が含まれています。一部のファイルは、ペイントプログラムのパレットとして(ピクセルデータが空白のまま)使用したり、他の画像と結合したりするために設計されています。そのため、BMPなどの他のフォーマットに比べて柔軟性は高いものの、構造ははるかに複雑です。
ILBMの場合、BMHD(ビットマップヘッダー)チャンクとその他の「重要な」チャンクは、BODYチャンクの前に存在する必要があります。BODYの後に現れるチャンクは「余分な」ものとみなされ、多くのプログラムはそれらを読み込まず、変更しません。[ 4 ]
BMHDチャンクは、画像の表示方法を指定するもので、通常はFORM内の最初のチャンクです。このチャンクは、画像の高さ/幅だけでなく、画面上のどこに描画されるか、さまざまな画面解像度でどのように表示するか、画像が圧縮されているかどうかも定義します。このチャンクの内容は次のとおりです。[ 4 ]
BODYチャンクは通常、ファイルの最後のチャンクであり、[ 4 ]最大のチャンクです。
ILBM ファイルでは、BODYチャンクに実際の画像データが、行ごとにインターリーブされたビットプレーン (およびオプションのマスク) として格納されます。ビットプレーンは 1 から n まで最初に表示され、その後にマスクプレーンが表示されます。画像が非圧縮の場合、各行は(width + 15) / 1616 ビット値 (つまり、ピクセルごとに 1 ビット、16 ビットの最も近い倍数に切り上げ) で構成されます。圧縮されている場合は、各行が個別に圧縮され、圧縮後も常に 16 ビットの倍数の長さになります。[ 4 ]
PBMファイルでは、BODYチャンクは圧縮されていないため、画像データを含む連続したバイト列としてより単純です。
画像が圧縮されている場合、各データ行(ただし各ビットプレーンではない)が個別に圧縮され、マスクデータが存在する場合はそれも圧縮されます。圧縮はフラグを使用したランレングス符号化(RLE)の一種です。以下のように復号できます。[ 4 ]
圧縮ルーチンでは、リテラル ランの前後にリテラル ランがある場合を除き、2 バイトの繰り返しランを複製ランとしてエンコードするのが最適です。リテラル ランがある場合は、3 つを 1 つのリテラル ランにマージするのが最適です。3 バイトを超える繰り返しは常に複製ランとしてエンコードしてください。[ 4 ]
CAMGチャンクは、コモドールAmigaコンピュータ専用のファイルです。これは、LONG型の「ビューポートモード」を格納します。これにより、「デュアルプレイフィールド」や「ホールドアンドモディファイ」といったAmigaの表示モードを指定できます。当然ながら、Amigaゲーム以外ではほとんど使用されていません。
意味のあるCAMGチャンクを含む可能性のあるファイルを変換または表示する必要がある場合は、以下の「ILBMファイルの操作に関する注意事項」を参照してください。
CMAPチャンクには画像のパレットが含まれており、使用されている各色に対応する 3 バイトの RGB 値で構成されています。各バイトは 0 ~ 255 の範囲です。チャンクの3 × numColours長さは バイトです。パレットの色数は になります2 ^ numBitplanes。このチャンクはオプションであり、存在しない場合はデフォルトのパレットが使用されます。想定よりもエントリ数が少なくなる場合があります (たとえば、4 プレーンの「16 色」ビットマップで 7 色など)。色の数が奇数の場合、IFF 仕様に従ってチャンクは 1 バイト追加されて偶数バイトの長さになりますが、パディング バイトはチャンクの長さフィールドには含まれないことに注意してください。[ 4 ]
カラーレンジチャンクは「非標準」です。これは、Electronic Arts の Deluxe Paint プログラムで、連続したカラーレジスタの範囲または「シェード範囲」とカラーサイクリングを識別するために使用されます。ILBM ファイルには 0 個以上のCRNGチャンクが存在する可能性がありますが、すべてBODYチャンクの前に出現する必要があります。Deluxe Paint は通常、ユーザーが「画像を保存」を要求したときに 4 つの CRNG チャンクを ILBM に書き込みます。[ 4 ]
CommodoreのGraphicraftプログラムは、カラーサイクリング範囲とタイミングにCCRTを使用します。このチャンクにはCycleInfo構造体が含まれています。CRNGと同様に、これは非標準のチャンクです。[ 4 ]
このデータはCRNGチャンクに似ています。プログラムはおそらく、カラーサイクルデータを表現する2つの方法のうちの1つだけを使用するでしょう。この情報をDeluxePaintとGraphicraftの両方に伝えたい場合は、両方を書き出すことができます。[ 4 ]
オプションのプロパティDESTは、0 個以上のソース ビットプレーンをより深い宛先イメージに分散させる方法を制御する方法です。一部の読者は DEST を無視するかもしれません。[ 4 ]
planePick、planeOnOff、planeMask の下位ビット数は、宛先ビットプレーンと 1 対 1 で対応します。ビット 0 はビットプレーン 0 に対応します。上位ビットは無視する必要があります。[ 4 ]
planePick の「1」ビットは「次のソースビットプレーンをこのビットプレーンに入れる」という意味なので、「1」ビットの数は numPlanes と等しくなければなりません。「0」ビットは「planeOnOff の対応するビットをこのビットプレーンに入れる」という意味です。[ 4 ]
planeMask のビットは、宛先ビットプレーンへの書き込みを制御します。「1」ビットは「このビットプレーンに書き込む」ことを意味し、「0」ビットは「このビットプレーンをそのままにしておく」ことを意味します。通常のケース(DESTチャンクがない場合)は、 [ 4 ]と同等ですplanePick = planeMask = (2 ^ numPlanes) - 1。
色の数値は、ソースビットマップ(numPlanes 個のプレーンの深さ)ではなく、宛先ビットマップ(depth planes 個の深さ)のピクセルによって形成されることに注意してください。[ 4 ]
オプションのGRABチャンクは、マウスカーソルや「ペイントブラシ」として使用する場合など、画像の左上隅を基準とした「ハンドル」または「ホットスポット」の位置を特定します。これはオプションです。[ 4 ]
SPRTチャンクは、画像がスプライトとして意図されていることを示します。したがって、マスク プレーンまたは透明な色を持ち、フルスクリーンであってはなりません。これがどのように処理されるかは、画像を使用するプログラムによって異なります。ここに格納される唯一のデータはスプライトの順序であり、多くのプログラムでスプライトを前景に配置するために使用されます (順序 1 のスプライトは順序 0 のスプライトの後ろに表示されます、など)。これはオプションです。[ 4 ]
TINYチャンクには、 Deluxe Paintなどの様々なグラフィックプログラム用の小さなプレビュー画像が含まれています。圧縮されており、 BODYチャンクと似た形式です。
ILBM ファイルには、カラー マップのみが含まれており、画像データが含まれていない場合があります。これは、画像に個別に適用できるカラー パレットを保存する場合によく使用されます。この場合、BODY チャンクは空で、BMHD チャンクの numPlanes フィールドは 0 になります。[ 4 ]
ILBM ファイルの中には、インデックスカラーではなく「トゥルーカラー」情報が含まれているものがあります。これらのいわゆる「ディープイメージ」ファイルには CMAP チャンクがなく、通常は 24 または 32 ビットプレーンがあります。ビットプレーンの標準的な順序では、赤色成分の最下位ビットが最初に配置されます。[ 4 ]
R0 R1 R2 R3 R4 R5 R6 R7 G0 G1 G2 G3 G4 G5 G6 G7 B0 B1 B2 B3 B4 B5 B6 B7
32ビットプレーンがある場合、最後の8ビットプレーンはアルファチャンネルになります。
R0 R1 ... R7 G0 ... G7 B0 ... B6 B7 A0 A1 A2 A3 A4 A5 A6 A7
カラーマップがなく、8ビットプレーンのみを含む画像は、グレースケール画像である可能性があります。
I0 I1 I2 I3 I4 I5 I6 I7
ILBM ファイルにビット 7 が設定されている CAMG チャンク (16 進数で 0x80) が含まれている場合、ファイルは Amiga チップセットの EHB (Extra Half-Brite) モードを使用することを想定しています。カラー マップには 32 エントリ以下しかありませんが、画像には 6 つのビット プレーンがあります。最上位のビット プレーンはフラグとみなされ、設定されていない場合は、通常どおり下位 5 ビットをカラー マップへのインデックスとして使用します。フラグが設定されている場合は、下位 5 ビットをカラー マップへのインデックスとして使用しますが、実際に使用する色は半分の明るさにする必要があります。これは、色の RGB コンポーネントを 1 ビット右にシフトすることで実現できます。または、64 エントリのカラー マップを作成し、下位 32 エントリを上位半分にコピーして半分の明るさに変換し、6 つのビット プレーンすべてをカラー インデックスとして使用します。[ 4 ]
PBM画像は、エクストラハーフブライトモードでは存在できません。
ILBM ファイルにビット 11 が設定されている CAMG チャンク (16 進数で 0x800) が含まれている場合、ファイルは Amiga チップセットの HAM (ホールド アンド モディファイ) モードを使用することを想定しています。HAM6 フォーマットでは、カラー マップは最大 16 エントリを持ちますが、イメージは 6 (または場合によっては 5) ビットプレーンを持ちます。HAM8 フォーマットでは、カラー マップは最大 64 エントリを持ちますが、イメージは 8 (または場合によっては 7) ビットプレーンを持ちます。[ 4 ]
最後の 2 つのビットプレーン (ビットプレーンの数が奇数の場合は、常に 0 である追加のビットプレーンを想定) は、最初の 4 (または 6) ビットプレーンの使用方法を示す制御フラグです。[ 4 ]
スキャンラインの最初のピクセルが修正ピクセルである場合は、修正して画像の境界色を使用します。[ 4 ]
色の構成要素を変更するために 4 ビットを使用する場合は、構成要素の上位 4 ビットと下位 4 ビットの両方に 4 ビットを使用する必要があることに注意してください (全体の色域が狭くなるのを避けるため)。6 ビットを使用する場合は、これはそれほど重要ではありませんが、変更ビットの最上位 2 ビットを色の構成要素の最下位 2 ビットに配置することもできます。[ 4 ]
PBM画像は、保持モードおよび変更モードでは存在できません。
ILBM および PBM ファイルを扱うユーティリティのほとんどは、MacPaintやDeluxe Paintのようにかなり古いものです。IrfanViewはファイルの表示が可能で、非商用利用は無料で、Linux 上で動作します。NetpbmはILBM から独自のPPMフォーマット[ 5 ]に画像を変換し、またその逆も可能です[ 6 ] 。Deluxe Paint にインスパイアされたピクセル アート グラフィック エディタGrafX2 は ILBM ファイルの読み込みと保存が可能ですが、最大 256 色に制限されているため、HAM または 24 ビット ILBM 画像ではすべての色を表示できません。Netpbmのilbmtoppmおよびppmtoilbmユーティリティがインストールされていれば、 ImageMagickおよびGraphicsMagickも ILBM 画像を表示および変換できます。