WMF / EMF文件格式转换C#

时间:2009-11-19 13:51:16

标签: c# image gdi 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绘图。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:9)

不幸的是,

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

所以你需要查阅古代文本!

This book came with a code sample CD-ROM,其中包含使用EMF播放API的示例程序。

这会给你带来两个问题。

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

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

    < / LI>

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

    <强>更新

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

    MS-EMF: Enhanced Metafile Format

    我上面链接的这本书的作者也提供了下载CDROM样本的源代码:

    Source code for Windows Graphics Programming

答案 1 :(得分:3)

查看此库: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
}