打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
wmf格式
WMF格式

 一、wmf格式是什么? 
     
Wmf是Windows Metafile 的缩写,简称图元文件,它是微软公司定义的一种Windows平台下的图形文件格式。我们先来解释几个名词: 

---- 图元文件头(metafile header): 是一个数据结构,它定义了储存在图元文件中图象的尺寸、图元文件的大小、调色板的数目、图元文件中记录数、指向图元文件描述的指针(如果存在的话)、指向图元文件调色板的指针(如果存在的话)。 

---- 图元文件设备上下文(metafile DC): 是一个用户图元文件操作的设备上下文。 

---- 图元文件句柄表(metafile handle table): 是标识用来建立存储在图元文件中的笔、刷子、字体以及其它对象的一组句柄。 

---- 图元文件调色板(metafile palette): 是一组红、绿、蓝的值,这些值表示建立存储在图元文件中的图象时所使用的颜色。 

---- 图元文件记录(metafile record): 是一个可变长的结构,结构中包含了诸如建立图象时设备的分辨率、图象的大小以及建立图象时所需要的GDI函数。 

---- 有了上面的概念,我们就可以给wmf格式文件一个定义: 

---- 图元文件是一个以二进制编码的、设备无关格式的多个结构的集合,这些结构包括图元文件头、调色板(可选的)、图元文件内容的文本描述(可选的)、图元文件记录。 

---- 图元文件分为内存图元文件和磁盘图元文件。内存图元文件是仅在内存某一个区域进行操作并存放的,大多用于图象的绘制、拷贝或者进程间的剪切板图形共享;磁盘图元文件则主要用于将绘制图象保存到磁盘文件中,以便事后重看。 

---- 二、 wmf格式的特点 

---- wmf格式文件的特点如下: 

---- 1. wmf格式文件是Microsoft Windows操作平台所支持的一种图形格式文件,目前,其它操作系统尚不支持这种格式,如Unix、Linux等。 

---- 2. 与bmp格式不同,wmf格式文件是设备无关的,即它的输出特性不依赖于具体的输出设备。 

---- 3. 其图象完全由Win32 API所拥有的GDI函数来完成。 

---- 4. wmf格式文件所占的磁盘空间比其它任何格式的图形文件都要小得多。 

---- 5. 在建立图元文件时,不能实现即画即得,而是将GDI调用记录在图元文件中,之后,在GDI环境中重新执行,才可显示图象。 

---- 6. 显示图元文件的速度要比显示其它格式的图象文件慢,但是它形成图元文件的速度要远大于其它格式。 

--  三、 wmf格式的应用场合 

---- 由图元文件的特点,可知图元文件与其它格式的图象文件差别很大。 

---- 首先,由于图元文件是以图象绘制操作序列来存放数据的,因此,它不适合于图象处理领域;其次,由于图元文件的图象显示速度慢,因此也不适合于需要快速显示的场合。 

---- 但是,微软之所以设计了这种格式,自然有它独特的地方,这就是wmf格式文件所占的磁盘空间比其它任何格式的图形文件都要小得多。也就是说,只要用对场合,只这一条,便可击败所有格式无对手。 

---- 一般地,图元文件的适用场合如下: 

     1. 由采集数据绘制曲线的图象快速保存。 

     2. 进程间的图象剪切板数据交换。 

---  四、 应用实例 

     由于篇幅所限,这里只针对图象的快速保存进行编程实践。 

      1. 功能设计 

     (1) 建立图元文件 为减少程序篇幅,这里假设将产生的图元文件保存到一指定的文件名Myfile.wmf,另外,将图形假设为一正弦波。 

     (2) 显示图元文件 打开图元文件MyFile.wmf,将刚才产生的图形恢复到显示器上。 

    2. 软件结构 

---- 在Windows 98平台下,采用Visual C++ 6.0 开发工具,其软件结构使用MFC的单文档(SDI)框架。 

    3. 程序实现 

    (1) 使用MFC AppWizard向导产生一应用框架 

---- 在VC++的“File”菜单中,单击“New”,弹出一New对话框。在“Projects”页中选择“MFC AppWizard [exe]”,在“Project name”编辑框中填入“MyWMF”,按“OK”按钮,退出New对话框。 

---- 在“MFC AppWizard Step 1”对话框中选择单选钮“Single document”,按“Finish”按钮即可完成应用框架的定制。 

     (2) 在视类的头文件MyWMFView.h中增加成员变量 

---- HMETAFILE m_hMetaFile; 

     (3) 增加“建立图元文件”和“显示图元文件”菜单 

---- 在“ResourceView”中,双击“Menu”下的“IDR_MAINFRAME”,在右边的窗口里,增加菜单“建立图元文件”,其标识为“ID_CREATEMETAFILE”;增加菜单“显示图元文件”,其标识为“ID_DISPMETAFILE”。 

    (4) 增加两个菜单所对应的消息处理函数 

---- 在VC++的“New”菜单中,单击“ClassWizard”,弹出一“MFC ClassWizard”对话框。在“Class Name”组合框中选择“CMyWMFView”,在“Object IDs”列表框中选择“ID_CREATEMETAFILE”,在右边的“Messages”列表框中双击“COMMAND”,之后弹出一对话框,点击“OK”按钮,即建立了一个消息处理函数“OnCreateWMF()”;使用同样的方法建立“ID_DISPMETAFILE”的消息处理函数“OnDispWMF()”。 

     (5) 在视类的执行文件MyWMFView.cpp的开始中增加头文件定义 

---- #include “math.h” 

     (5) 在消息处理函数“OnCreateWMF()”中增加代码如下: 

---- 

 //类CMetaFileDC的实例化 CMetaFileDC metaFileDC; //建立图元的输出文件 metaFileDC.Create("MyFile.wmf"); //设置文本颜色和笔颜色 metaFileDC.SetTextColor(RGB(255,0,0,)); CPen thePen(PS_SOLID,1,RGB(0,0,255,)); CPen * pOldPen=metaFileDC.SelectObject(&thePen); //在图元文件中绘制矩形框 metaFileDC.Rectangle(15, 15, 530, 230); //在图元文件中绘制正弦波 for (int i=1; i< 500; i++) {  metaFileDC.MoveTo(20+i-1, 120-80*sin(0.1*(i-1)));  metaFileDC.LineTo(20+i,   120-80*sin(0.1*i)); } //在图元文件中绘制文本 metaFileDC.TextOut(200,250,"图6  电机载荷正弦波曲线图"); //恢复缺省的笔 metaFileDC.SelectObject(pOldPen); //将以上绘制写入图元文件MyFile.wmf,关闭之,最后返回图元文件的句柄m_hMetaFile = metaFileDC.Close();     (6) 在消息处理函数“OnDispWMF()”中增加代码如下:       //定义一个客户区设备上下文,用于显示图元文件 CClientDC clientDC(this); //打开图元文件,返回图元文件句柄 HMETAFILE hmf=GetMetaFile("MyFile.wmf”); //显示图元文件,再现所绘制的曲线 clientDC.PlayMetaFile(hmf);

     (7) 经过编译、链接,形成可执行文件 MyWMF.exe。 

---- 使用时先点击菜单“建立图元文件”,即可发现,在当前文件夹下,生成一个新文件MyFile.wmf;然后,再点击菜单“显示图元文件”,即可在客户区显示一幅正弦波曲线。 

---- 五、 结束语 

---- 虽然WMF格式其结构定义比较复杂,但通过上面的编程实践,可见其实现起来并不复杂。这主要得力于MFC将内部复杂的处理封装在CMetaFileDC类中,对这个类的正确使用,即可达到事半功倍的效果。另外,我们在比较某某图象格式时,不能一言以蔽之,武断地说某某好某某不好,而应该结合具体的应用场合。

    WMF是一种矢量图片格式,支持透明,与Gif相似。使用的方法是在 ACDsee 的缩略图浏览方式下,在图片上单击右键,选取弹出菜单中的“复制图片(Copy Image)”,再在PhotoShop中粘贴出来便可。用这个方法导出的图片,一般都有300X300个像素以上,便于编辑修改,尤其适用于Logo制作。  

    *.wmf(Windows Metafile Format)是Microsoft Windows中常见的一种图元文件格式,它具有文件短小、图案造型化的特点,整个图形常由各个独立的组成部分拼接而成,但其图形往往较粗糙,并且只能在Microsoft Office中调用编辑。

         flash中的应用:Wmf文件是Windows Metafile 的缩写,简称图元文件,它是微软公司定义的一种Windows平台下的图形文件格式。由一种矢量文件,具有体积小、易编辑、缩放不失真的明显优势,导入后,直接出现在场景中,而不在库里生成元件,(选择导入到库时,拖到场景中时以元件的形式出现)。导入的wmf文件保留原来图形的性质,取消组合后相当于图形打散,可以改变颜色和形状,我们可以把自己创作的元件保存成wmf格式备用,也可以从网上搜索大量的wmf文件为我所用。

 

为已有的Java图形程序增加储存WMF矢量文件功能

 

Java提供了将图形转储为jpg格式的功能, 但这种格式不是矢量格式,没办法在word等软件中修改,编辑。

word中的矢量图形格式是wmfWindows Meta File)。这种格式主要由一个或两个information headers组成,结构如下:

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;

除了headers之外下面就是文件记录(Standard Metafile Records)。结构如下:

typedef struct _StandardMetaRecord

{

    DWORD Size;          /* Total size of the record in WORDs */

    WORD  Function;      /* Function number (defined in WINDOWS.H) */

    WORD  Parameters[];  /* Parameter values passed to function */

} WMFRECORD;

也就是说每一个record中储存的是Windows GDI绘图函数的代码及每个函数对应的参数.这样的
话整个wmf文件就由这样的函数编码与参数组成。就像下面这样:

Record Name

Function Number

AbortDoc

0x0052

Arc

0x0817

Chord

0x0830

DeleteObject

0x01f0

Ellipse

0x0418

...

了解了wmf文件的格式,我们就清楚我们如何将我们的图形储存为wmf格式了。我们知道在
JAVA
中所有的绘图操作都是通过Graphics来完成的。基本上Graphics中的每一个绘图函数
Windows GDI中都有对应,我们只需继承一个Graphics类,重载它的每一个方法,转成
对应的Windwos GDI函数,就可以达到我们的目的了。

Graphics中的函数很多,工作量巨大,不用怕,网上已有人写好了,大家请到:
http://piet.jonas.com
去下载一个WMFWriter吧。

下载后,将它加到classpath,再请使用我写的这个类,轻松的将你的图形存为wmf格式:

/**
 * Copyright:    Copyright (c) 2002
 * Company:
 * @author Turbo Chen

 * @version 1.0



 */

public class WMFWriter
{

    /** comp是你的图形所在的JComponent,out是你指定的输出流


    public void write(JComponent comp, OutputStream out) throws Exception
    {
        try
        {
            int w = comp.getSize().width;
            int h = comp.getSize().height;
            WMF wmf = new WMF();
            WMFGraphics wmfgraphics = new WMFGraphics(wmf, w, h);
            comp.paint(wmfgraphics);
            wmf.writePlaceableWMF(out, 0, 0, w, h, Toolkit.getDefaultToolkit().getScreenResolution());
            wmfgraphics.dispose();
            out.close();
        }
        catch(Exception exception)
        {
            throw new Exception("GRAPHICS ERROR,CAN NOT CREATE WMF FORMAT");
        }
    }


}

 作者Bloghttp://blog.csdn.net/turbochen/

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
扩展名后缀及打开方式大全
GDI 编程小结
Metafiles
常用图形、图像文件格式及特点
C#绘制矢量图(Metafile,WMF,EMF)
史上“最骚气”公式编辑器,你了解多少!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服