AutoCAD R13 以降では、開くファイルを選択するダイアログボックスで、図面のプレビューイメージを表示できるようになっています。このプレビュー機能は、DWGファイル内の図面のデータそのものを使っているわけではありません。図面データ保存時にプレビュー用としてビットマップやメタファイル形式のイメージデータをファイル内に埋め込むことができ、それを表示するようになっています。つまり、プレビューイメージのデータがDWGファイル内にどのように格納されているのかがわかれば、AutoCADを使わなくても簡単なビットマップやメタファイル表示のプログラムにより、プレビューイメージを見ることができます。
AutoCAD DWGファイルで、プレビューイメージに関する部分は次の例のようになっています。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F | |
00000000 | 41 | 43 | 31 | 30 | 31 | 32 | 00 | 00 | 00 | 00 | 00 | 06 | 01 | A8 | 0E | 00 |
00000010 | 00 | 00 | 00 | 16 | 00 | 04 | 00 | 00 | 00 | 00 | 4F | 00 | 00 | 00 | B3 | 01 |
・・・ | ||||||||||||||||
00000EA0 | AC | DB | BF | F6 | ED | C3 | 55 | FE | 1F | 25 | 6D | 07 | D4 | 36 | 28 | 28 |
00000EB0 | 9D | 57 | CA | 3F | 9D | 44 | 10 | 2B | E2 | 0F | 00 | 00 | 03 | 01 | D8 | 0E |
00000EC0 | 00 | 00 | 50 | 00 | 00 | 00 | 02 | 28 | 0F | 00 | 00 | D6 | 08 | 00 | 00 | 03 |
00000ED0 | FE | 17 | 00 | 00 | A0 | 06 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
・・・ | ||||||||||||||||
00000F20 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 28 | 00 | 00 | 00 | 00 | 01 | 00 | 00 |
00000F30 | 9E | 00 | 00 | 00 | 01 | 00 | 08 | 00 | 01 | 00 | 00 | 00 | 8E | 08 | 00 | 00 |
00000F40 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 08 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
00000F50 | FF | FF | FF | 00 | 00 | 00 | FF | 00 | 00 | FF | FF | 00 | 00 | FF | 00 | 00 |
・・・ |
先頭の青字の部分を文字コード(ASCII)として見てみると、この例では「AC1012」となります。この部分は、AutoCADのバージョンにより次のような値が書き込まれます。
DWGファイルのプレビューはR13から追加された機能ですので、それ以前のバージョンのDWGファイルにはプレビューイメージデータは含まれていません。プレビューイメージを読み出すには、まずこの先頭6バイトを調べ、R13以降のDWGファイルであることを確認します。次に、ファイル先頭から14〜17バイト目のデータ(上図の赤字部分)を調べます。この部分に、プレビューイメージデータに関する情報を記録している場所が、ファイル先頭からの相対アドレスで書き込まれます。(この例では 00000EA8H) このアドレス+20バイトのところに、プレビューイメージの個数が格納されます。そして、その個数分だけ、次の情報が繰り返し格納されます。
項目 | バイト数 | 内容 |
iType | 1 | 1 ... 不明、2 ... ビットマップ形式、3 ... メタファイル形式 |
iAddress | 4 | データの先頭アドレス |
iSize | 4 | データサイズ(バイト数) |
データ種類が1のアドレスが示す領域はとりあえず無視し、データ種類が2または3のものについて、抽出を行います。上の例では、2順目のデータ列はビットマップ形式のデータがアドレス00000F28Hから08D6Hバイトに渡って存在することを表し、3順目のデータ列がメタファイル形式のデータがアドレス000017FEHから06A0Hバイトに渡って存在することを表しています。
DWGファイルにプレビューイメージ用として埋め込まれるビットマップデータを Windows のビットマップデータとして扱うためには、ヘッダ情報を一部補う必要があります。Windows のビットマップ(DIB形式)データは、まず、次に示すヘッダ部分があり、それにカラーテーブルが続き、その後にビットマップ本体が格納されます。
項目 | バイト数 | 内容 |
bfType | 2 | "BM" という文字 |
bfSize | 4 | ファイルサイズ |
bfReserved1 | 2 | 常に 0 |
bfReserved2 | 2 | 常に 0 |
bfOffBits | 4 | データビットのファイル先頭からのオフセット |
biSize | 4 | ビットマップ情報構造体のサイズ: 28H |
biWidth | 4 | ビットマップの幅 (ピクセル単位) |
biHeight | 4 | ビットマップの高さ (ピクセル単位) |
biPlanes | 2 | 常に 1 |
biBitCount | 2 | ピクセルあたりのカラービット数 (1/4/8/24) |
biCompression | 4 | 圧縮方式 (圧縮しないときは 0) |
biSizeImage | 4 | ビットマップビットのサイズ (バイト単位。圧縮するときのみ必要) |
biXPelsPerMeter | 4 | 水平解像度 (1メートルあたりのピクセル数) |
biYPelsPerMeter | 4 | 垂直解像度 (1メートルあたりのピクセル数) |
biClrUsed | 4 | イメージで使われている色の数 |
biClrImportant | 4 | イメージで使われている重要な色の数 |
プレビューイメージ用として埋め込まれるビットマップデータのヘッダ情報は、上の表のうち、biSize以下のものしか持っていません。前節のビットマップ形式のデータサイズも、これらヘッダ情報の先頭部分を除いたサイズになっています。つまり、bfType〜bfOffBitsの項目は、別途、次のように作成する必要があります。
ここで、カラーテーブルサイズは、次のようになります。
biSize以降のヘッダ情報からカラーテーブル、ビットマップビットは、DWGファイルから抽出したものをそのまま使うことができます。ただし、DWGファイルから抽出したビットマップイメージの背景色は、図面を保存した時のAutoCADの作図エリア背景色に関係なく、常に白色になっています。プレビューイメージとして表示する時に背景色を変えたい場合は、カラーパレットのカラー値を変更します。
プレビューイメージ用のメタファイルデータは、前述の03Hから始まる9バイトの領域に書かれた先頭アドレス、データサイズに従い、データを抽出すると、それがAPM(Aldus Placeable Metafile)形式のWMFデータになっています。APM形式のWMFデータは、Windows3.1のAPIで作成されるメタファイルデータの前に、次に示すAPMヘッダが付加されています。
項目 | バイト数 | 内容 |
key | 4 | 9AC6CDD7H |
hmf | 2 | 0 |
bbox | 8 | 論理座標での境界矩形 |
inch | 2 | 論理座標での長さをインチに換算するための係数 |
reserved | 4 | 0 |
checksum | 2 | このヘッダの先頭から10ワードのXOR |
上記の内容は、Autodesk社が公開している情報ばかりではなく、独自の調査によるものも含まれています。これらの情報は無保証でありサポート対象外ですので、参考にする場合はご注意ください。