WMF/EMF文件格式转换C#

Fla*_*ker 5 c# gdi image wmf

在我的程序中,我需要"回放"或"解析"窗口元文件(WMF和EMF).我已经通过MSDN和Google挖掘了,我最接近的是图形.EnumerateMetafile方法.我可以让它工作,因为我的EnumerateMetafileProc回调被调用,然后我可以调用PlayRecord.缺少的是如何从该回调中获取有用的数据.

我查看的示例:http://msdn.microsoft.com/en-us/library/ms142060.aspx

回调有一个recordType参数,它是一个ENUM.这看起来很有用,除了它们似乎无法将数据转换为任何有用的类型.

我的目标是回放WMF/EMF的创建,这样我就可以对具有类似(DrawLine,DrawPoint,DrawArc)等方法的专用图形类进行函数调用.从某种意义上说,我正在以完全不同的格式(转换)重新创建WMF/EMF绘图.

非常感谢任何帮助.

Dan*_*ker 9

不幸的是,Graphics.EnumerateMetafile是Win32 API周围非常非常薄的一层.对于EMF中的每条记录,您将获得特定于记录的结构的非托管内存地址.没有关于它可能包含的内容的文档 - 但是,在Win32世界中也没有太多可继续的内容.

所以你需要参考古代文本!

本书附带了一个代码示例CD-ROM,其中包含使用EMF回放API的示例程序.

这给你留下了两个问题.

  1. 这本书显然已绝版,因此请确保您购买的任何用过的副本都包含一张可用的CD-ROM.

  2. 示例代码全部使用C/C++,并且为100个左右的结构声明必要的互操作将是一项非常重要的任务,用于描述所有EMF记录.

所以另一种方法可能是在.NET中声明一个巨大的接口,它有一个方法用于你需要拦截的每个GDI调用,然后使用C++/CLI来调整示例C++代码,以便它调用每个记录的巨大接口.

更新

虽然用于EMF播放的MSDN文档不包含特定EMF记录的详细信息,但Microsoft已于2006年单独发布了完整规范:

MS-EMF:增强的图元文件格式

我上面链接的书的作者也可以下载CDROM样本的源代码:

Windows图形编程的源代码