WMF / EMF文件格式转换C#

在我的程序中,我需要“回放”或“解析”窗口元文件(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绘图。

非常感谢任何帮助。

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

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

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

这会给你带来两个问题。

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

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

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

更新

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

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

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

Windows图形编程的源代码

看看这个库: http : //wmf.codeplex.com/

想法是循环WMF记录并将形状,画笔等转换为其他格式

WmfDocument wmf = new WmfDocument(); wmf.Load(path); foreach (var record in wmf.Records) { if (record is WmfCreateBrushIndirectRecord) { var brush = record as WmfCreateBrushIndirectRecord; Console.WriteLine("Color: " + brush.Color); Console.WriteLine("Style: " + brush.Style); Console.WriteLine("Hatch: " + brush.Hatch); //Do something with brush here... } else if (record is WmfRectangleRecord) { var rectangle = record as WmfRectangleRecord; //Do something with rectangle... } else if ... //Other shapes to be implemented }