バイナリデータがメタファイルであると判断するには

解決


kun  2003-07-19 00:14:14  No: 51794

バイナリで渡されたデータが、Windowsメタファイル or 拡張メタファイル or 以外
かどうかを判断したいのですが良い方法が見つからず悩んでいます。

現在、Aldus Placesbleヘッダが付いているWindowsメタファイルは
先頭4バイトを「D7 CD C6 9A」比較する事で判断しています。

拡張メタファイルは、先頭から41バイト目の位置から4バイトを
「20 45 4D 46」(" EMF") と比較して判断しています。

ただAldus Placesbleヘッダが付いていないWindowsメタファイルの判断を
どのようにすれば良いのかが判りません。
良い方法がありましたら教えてください。


pbmplus  2003-07-19 03:25:10  No: 51795

そうですね、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;


kun  2003-07-19 03:52:23  No: 51796

pbmplusさん、情報ありがとうございます。

>   WORD  HeaderSize;     /* Size of header in WORDS (always 9) */
WORD単位のサイズなんですね。
METAHEADER構造体はWORDとDWORDで構成されているのに、何故
HeaderSizeが奇数の 9 なのかと疑問に思っていました。
もしかすればMETAHEADERの前にもう一つ別のヘッダが存在するのか、
と考えて混乱していました。

とりあえず、FileType、FileSize、NumOfParams 辺りから100%では無いにしろ
判断できそうです。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加