圖元格式介紹
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. 進程間的圖象剪下板數據交換。
其實,wmf格式也有著它獨特的優越性
關於套用實例
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類中,對這個類的正確使用,即可達到事半功倍的效果。另外,我們在比較某某圖象格式時,不能一言以蔽之,武斷地說某某好某某不好,而應該結合具體的套用場合。