バイナリで渡されたデータが、Windowsメタファイル or 拡張メタファイル or 以外
かどうかを判断したいのですが良い方法が見つからず悩んでいます。
現在、Aldus Placesbleヘッダが付いているWindowsメタファイルは
先頭4バイトを「D7 CD C6 9A」比較する事で判断しています。
拡張メタファイルは、先頭から41バイト目の位置から4バイトを
「20 45 4D 46」(" EMF") と比較して判断しています。
ただAldus Placesbleヘッダが付いていないWindowsメタファイルの判断を
どのようにすれば良いのかが判りません。
良い方法がありましたら教えてください。
そうですね、WMF(ヘッダあり)/EMFの判別方法はこれで問題ありませんね。
WMF(ヘッダなし)はなかなか曲者です。この辺りは「METAHEADER(WMFHEAD)」
を使って判別するかしかないようです。
WMF -------------------------------------------------------
・Standard metafile format (読み込めないソフトが多い)
・Placeable metafile format (一般的)
・Clipboard metafile format (普通は無視)
-----------------------------------------------------------
http://www.wotsit.org/
で「WMF」を検索すると表示される
「Windows Metafile Format WMF/EMF/APM (html)」
というものが参考になるかと思います。
typedef struct _WindowsMetaHeader
{
WORD FileType; /* Type of metafile (0=memory, 1=disk) */
WORD HeaderSize; /* Size of header in WORDS (always 9) */
WORD Version; /* Version of Microsoft Windows used */
DWORD FileSize; /* Total size of the metafile in WORDs */
WORD NumOfObjects; /* Number of objects in the file */
DWORD MaxRecordSize; /* The size of largest record in WORDs */
WORD NumOfParams; /* Not Used (always 0) */
} WMFHEAD;
pbmplusさん、情報ありがとうございます。
> WORD HeaderSize; /* Size of header in WORDS (always 9) */
WORD単位のサイズなんですね。
METAHEADER構造体はWORDとDWORDで構成されているのに、何故
HeaderSizeが奇数の 9 なのかと疑問に思っていました。
もしかすればMETAHEADERの前にもう一つ別のヘッダが存在するのか、
と考えて混乱していました。
とりあえず、FileType、FileSize、NumOfParams 辺りから100%では無いにしろ
判断できそうです。ありがとうございました。
ツイート | ![]() |