AutoCADのネイティブデータであるdwgファイルの中にサムネイル用画像があるという事実は、知る人ぞ知るハック。
昔々にネットから得た技術だが、CAD開発者の高齢化に伴って消えてなくなってしまった模様。
dwgはバイナリなので、どこにそんな情報があるんだというのを素人には解析できないため、非常にニッチなCAD開発者界隈では有益な情報となるだろう。
1.先頭4バイトでバージョンチェック
dwgの先頭4バイトで、dwgのバージョンをチェックするというのは常套手段なので界隈では有名な話。
AC1012やAC1032となっているので、この数字から古いバージョンをハネる必要がある。
AC1012はR13Jというバージョンで、これより小さい数字の場合はサムネイル用画像がないと判断して処理をやめる。
2.イメージ開始アドレス
dwgの先頭から13バイト目からの4バイトを符号なし整数で受けると、それがイメージ開始アドレスとなる。
3.イメージのブロック数とブロック
2で得たアドレスプラス20バイトにあるのがブロック数なので、1バイト符号なし整数で受ける。
21バイト目以降にブロックがあるので、ブロックの構造体で受ける。
4.ブロックの構造体
BYTE type; // タイプ 1:不明 2:ビットマップ 3:メタファイル 6:png
long lStart; // 開始アドレス
long lSize; // サイズ
以上3つの変数で受けてサイズ分オフセットしていくので、可変長のブロックであることがわかる。
実際にどんなデータが来るかの傾向を明らかにする。
R13Jで作ったと思われる古いdwgだと、ブロックの1つ目にタイプ2のビットマップが来た。
ビットマップのタイプとしてはDIBなので、画面に表示するならDDBに変換しておく必要あり。
AutoCAD 2026で2018形式で保存したdwgだと、ブロックの2つ目にタイプ6のpngが来た。
昔々のMFCではpngを扱えなかったので外部ライブラリを使うなんてメンドウな状況だったが、時代は変わり今ではCImageクラスで軽々と扱える。.NETならもピクチャーボックスでサクっと使える。
C++やC#(VB.netもか)のプログラマーならこれだけの情報で、dwgからサムネイル用画像を抜き出せるはず。
エクスプローラーのようなファイル一覧で、高速にサムネイル表示ができて、どのファイルがどんな絵なのかをユーザーに認知させることとなり、とっても有益な機能になること請け合い。
ぜひ実装してくれたまえ!