EMF檔案分析

來源:互聯網
上載者:User

分析EMF檔案以及類比繪製已經有一段時間了,這裡做個總結。然後繼續重構雁哥代碼。(寫代碼不寫注釋會遭雷劈的!!)

MSDN的資料是寶,但只是對於看得懂的人來說。

http://msdn.microsoft.com/en-us/library/cc230565(PROT.13).aspx

 

第一部分:

EMF檔案對裝置描述表中的對象採用了object table機制。

http://msdn.microsoft.com/en-us/library/cc231165(PROT.10).aspx

 

即在操作了下列幾個圖元函數後在各自的ihpen,ihbrush,ihfont等(未列出color space, palette)進行編號

1,EMR_EXTCREATEPEN,EMR_CREATEPEN

2,EMR_CREATEBRUSHINDIRECT

3,EMR_EXTCREATEFONTINDIRECTW

 

其號碼順序按照出現前後次序進行編製。例如先建立畫筆,則畫筆的ihpen = 1.按序下來。

之後直到遇到EMR_DELETEOBJECT,則把object table中的相應號的object刪除,之後有新建立的object則填入空缺處。

 

對於這個過程的理解是寫分析代碼,從資料找出規律。

 

第二部分:

as類比GDI的裝置描述表

GDI的裝置描述表儲存了mapmode,page->device座標轉換,pen,brush,bmp,font,等資訊。

類比DC主要是EMF的records中有EMR_SAVEDC,EMR_RESTOREDC操作。

 

第三部分:

as類比路徑填充,畫圖填充

在重構這部分代碼中,覺得代碼架構的設計起到重要作用,涉及的邏輯是遍布整塊代碼。

 

第四部分:

as繪製位元影像像素

從位元影像的檔案結構可以知道只要擷取像素值,就可以直接繪製,但這樣考慮太過不成熟。

下面是要考慮的分析步驟:

1,位元影像分1,4,8,16,24,32位(以下步驟均要分別考慮這些位情況)

2,四個位元組對齊(沒有對齊會出現菱形切割成合并成正方形)

  16位的對齊方程如下:

 int pitch = width + width % 2;

 int positionnow = beginbitsposition + (y * pitch + x) * 2;

3,分離RGB,再合成到32位元模式下,注意:AS中的RGB位元組排序從右至左是BGR

4,判斷圖片是否旋轉

   如果位元影像資訊的height > 0 則為翻轉,否則為正常

第五部分:

as架構設計

相當於做EMF讀取繪製引擎,一來是想,能夠以後重用,二來,最重要的一點,保證效率.雖然用SVG可以很方便的類比出EMF。不過按濤哥的意思,還是做個自家產的東西更好。

不過在重構路上,代碼越寫越是覺得跑起來肯定不理想。跑上一萬次迴圈是到處可見的,一萬就耗時1秒了。另外as的記憶體管理實在讓人不太放心。從as的類庫上,整塊的處理是uicomponent->sprite(文字),shape(繪圖),bitmap(位元影像),把後面的容器裝填到前面的容器內,再顯示到舞台上。最後還是試試用swc來試試跑迴圈那邊的邏輯,看看效率如何再辦.

第六部分:

代碼重構不出來,心裡不踏實。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.