このページの最終更新日 2020/10/25

Windows Meta File

画像の形式にWindowsMetaFile形式というものがあります。これはベクトル形式で画像の情報を持っており、 画像の中にあるテキストデータを単独のデータとして保有しています。例えば次の例はPowerPointで三角形と1~9の 数字を書き込み、WMF形式で出力した画像をバイナリデータで比較したものです。

左右の画像について、三角形の大きさは同じですが、左側は赤く塗りつぶし、右側は黒く塗りつぶした画像になっています。 また、数字については、左側の「0」の部分が右側では「9」となっています。 WMFの形式を理解するために、このようなWMFの画像の違いが、バイナリデータではどのような違いとなっているのかを下に示します。

2つのWMFファイルをWinMergeで読み込み、バイナリデータを比較したものを次に示します。


赤色は16進数で表現すると「ff0000」、黒色は「000000」であり、この画像の違いは「0e0」列に出ていることが解るでしょう。 また全角0の文字コードは「4f」、全角9の文字コードは「58」ですから、この文字の違いも「2c0」列に出てくることが解ります。 このように、WMFファイルは画像の情報と文字列の情報を分離した形で持っていることが解るでしょう。 次はさらなる具体的なデータの形式について説明します。


では、上の左側に示したバイナリデータを詳しく見ていきます。この画像のデータは正確には「Placeable Metafile」と言い、通常のMetafileではヘッダーが18Byte ありますが、Placeable Metafileはさらに22Byte 加わって、合計40Byte がファイルのヘッダデータになります。

ヘッダの40Byte を青色で示します。先頭の4Byte「9AC6CDD7」は、このファイルがPlaceable Metafile であることを識別するためのデータです。また、ヘッダでは画像の大きさや、データに不整合が発生していないかを確認するチェックサム情報を保持しています。

d7 cd c6 9a 00 00 00 00 00 00   80 16 e0 10 40 02 00 00 00 00

31 53 01 00 09 00 00 03 a0 01   00 00 06 00 1c 00 00 00 00 00

04 00 00 00 03 01 08 00 05 00   00 00 0b 02 00 00 00 00 05 00

00 00 0c 02 94 11 70 17 03 00   00 00 1e 00 04 00 00 00 2c 01

00 00 07 00 00 00 16 04 30 75   30 75 d0 8a d0 8a 04 00 00 00

27 01 ff ff 03 00 00 00 1e 00   07 00 00 00 fc 02 00 00 ff ff

ff 00 00 00 04 00 00 00 2d 01   00 00 08 00 00 00 fa 02 05 00

00 00 00 00 ff ff ff 00 04 00   00 00 2d 01 01 00 0e 00 00 00

24 03 05 00 ff ff ff ff ff ff   94 11 70 17 94 11 70 17 ff ff

ff ff ff ff 08 00 00 00 fa 02   00 00 00 00 00 00 00 00 00 00

04 00 00 00 2d 01 02 00 04 00   00 00 2d 01 00 00 07 00 00 00

fc 02 00 00 ff 00 00 00 00 00   04 00 00 00 2d 01 03 00 04 00

00 00 06 01 01 00 04 00 00 00   2d 01 01 00 0a 00 00 00 24 03

03 00 bd 01 8a 10 fb 0b ab 00   3a 16 8a 10 04 00 00 00 2d 01

02 00 04 00 00 00 06 01 01 00   04 00 00 00 2d 01 00 00 04 00

00 00 27 01 ff ff 03 00 00 00   1e 00 03 00 00 00 1e 00 04 00

00 00 2c 01 00 00 07 00 00 00   16 04 94 11 70 17 00 00 00 00

1c 00 00 00 fb 02 b3 fe 00 00   00 00 00 00 90 01 00 00 00 80

04 00 04 32 82 6c 82 72 20 82   6f 83 53 83 56 83 62 83 4e 00

00 00 00 00 00 00 00 00 00 00   00 00 00 00 00 00 04 00 00 00

2d 01 04 00 04 00 00 00 2e 01   18 00 04 00 00 00 02 01 01 00

05 00 00 00 09 02 ff ff ff 02   16 00 00 00 32 0a f9 0c a2 09

0a 00 00 00 82 50 82 51 82 52   82 53 82 54 e4 00 00 00 e4 00

00 00 e4 00 00 00 e4 00 00 00   e4 00 00 00 1c 00 00 00 fb 02

12 00 08 00 00 00 00 00 90 01   00 00 00 80 01 02 02 02 53 79

73 74 65 6d 00 00 00 00 00 00   80 c5 e3 0c 00 00 00 00 50 55

62 0e 00 00 00 00 bd 27 82 fe   04 00 00 00 2d 01 05 00 04 00

00 00 f0 01 04 00 04 00 00 00   27 01 ff ff 04 00 00 00 27 01

ff ff 03 00 00 00 1e 00 03 00   00 00 1e 00 04 00 00 00 2c 01

00 00 07 00 00 00 16 04 94 11   70 17 00 00 00 00 1c 00 00 00

fb 02 b3 fe 00 00 00 00 00 00   90 01 00 00 00 80 04 00 04 32

82 6c 82 72 20 82 6f 83 53 83   56 83 62 83 4e 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00   00 00 04 00 00 00 2d 01 04 00

04 00 00 00 2e 01 18 00 04 00   00 00 02 01 01 00 05 00 00 00

09 02 ff ff ff 02 16 00 00 00   32 0a 89 0e a2 09 0a 00 00 00

82 55 82 56 82 57 82 58 82 4f   e4 00 00 00 e4 00 00 00 e4 00

00 00 e4 00 00 00 e4 00 00 00   04 00 00 00 2d 01 05 00 04 00

00 00 f0 01 04 00 04 00 00 00   27 01 ff ff 04 00 00 00 27 01

ff ff 03 00 00 00 1e 00 04 00   00 00 2c 01 00 00 07 00 00 00

16 04 30 75 30 75 d0 8a d0 8a   04 00 00 00 27 01 ff ff 03 00

00 00 1e 00 04 00 00 00 2c 01   00 00 07 00 00 00 16 04 95 11

71 17 00 00 00 00 04 00 00 00   27 01 ff ff 03 00 00 00 1e 00

04 00 00 00 27 01 ff ff 03 00   00 00 00 00 __ __ __ __ __ __


また、Metafileは「Record」と呼ばれるブロックの繰り返しで構成されており、それぞれのブロック毎に意味を持っています。

赤字で示したバイト数が各Recordブロックの開始位置であり、また、赤字のバイト数×2Byte(Word)が自身のブロックデータの長さであることを示しています。 画像を描画するためのデータはヘッダを除いた21Byte目の「04」から開始します。この「04」の意味するように 8byte(4word)進むと次の「05」で始まるブロックに突き当たります。続けて10byte(5word)進むと、また次のブロックに突き当たります。このようにしてファイルの最後のブロックまで辿りつくことが出来ます。