2009-11-19 163 views
4

在我的程序中,我有一个要求“回放”或“解析”Windows元文件(WMF和EMF)。我已经通过MSDN和Google挖掘出来了,而最接近的是Graphics。 EnumerateMetafile方法。我可以让它工作,因为我的EnumerateMetafileProc回调被调用,然后我可以调用PlayRecord。缺少的是如何从回调中获得有用的数据。WMF/EMF文件格式转换C#

实施例I看着:http://msdn.microsoft.com/en-us/library/ms142060.aspx

回调具有RECORDTYPE参数,这是一个ENUM。那么这看起来很有用,除了他们似乎没有办法将数据转换成任何有用的类型。

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

在这方面的任何帮助是非常赞赏。

+0

请问你的目标格式是什么? (如果是PDF格式,你应该使用PDF打印机驱动程序进行检查) – 2009-11-26 05:24:25

回答

6

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

所以你需要咨询古文本!

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

这给你留下了两个问题。

  1. 这本书显然已绝版,所以请确保您购买的任何旧版本包括工作光盘。

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

所以另一种方法可能会宣布在.NET中一个巨大的接口,对每个GDI的方法叫你需要拦截,然后用C++/CLI所以它调用到你的适应例如C++代码每个记录都有巨大的界面。

更新

虽然EMF播放MSDN文档不包括具体的EMF记录的详细信息,微软已另行公布完整的规范截至2006年:

MS-EMF: Enhanced Metafile Format

另外,我连接上面的书的作者已经提供了可供下载的CDROM样本的源代码:

Source code for Windows Graphics Programming

2

看看这个库: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 
}