dui框架開發系列:32位和565BMP的ALPHA混合和資源打包

-JALEN-發表於2014-09-01

大家好,我要介紹的所有知識點都是WINCE/windows觸控式螢幕DUI開源框架constvar(點選下載程式碼)開發過程中遇到的比較有討論價值的問題。

 

 本文要討論的是BMP點陣圖的ALPHA運算,及資源的打包等。

 

1.圖片資源打包處理一些值得注意的地方

 

為了使美工人員編輯圖片方便,我們使用的圖片資源都是帶透明PNG格式的。PNG製作方便並且預覽效果很直接,而32位BMP雖然效果不讓於PNG,但製作和看起來確實很坑爹。

 

WINCE/windows程式執行的時候最終使用的終究是BMP,所以我們採用的方法是用PNG作資源,然後用CVUI介面編輯好介面的時候,把PNG轉成32位帶ALPHA通道的圖片了。打包的時候,則可選擇性的對不重要的介面用ZLIB演算法進行壓縮。這樣的好處就是壓縮的資源(裸BMP資料)只需解壓就可以用了,一些使用頻繁的介面則可以不壓縮直接打包,讀的時候不用解壓會比節省解壓的時間。

 

對於只能支援16位色深度的機器來說(一般都是565格式), 565 bmp的ALPHA混合也是避免不了的。但是565BMP本身不帶ALHPA通道,所以我們從透明PNG轉成565時,把轉好的ALPHA(32級)必須單獨儲存.每一個畫素的ALPHA雖然用5位能儲存,但是為了防問ALPHA速度,就用一個位元組儲存。 這也就意味著一個565的畫素點實際上用3個位元組表示,2個位元組的RGB資料,1個位元組的ALPHA資料。 這樣就能實現565圖片的透明瞭。 另外在PNG轉32位BMP再轉565BMP+ALPHA的時候,用到了影像減少失真(水波紋)的誤差擴散演算法。

 

2. 565和32點陣圖片的ALPHA混合

從資源包讀取到565和32圖片資料,如果沒有加速指令支援,565就把資料由16位轉32位,G的6位移到高16位去,搜一下0X07E0F81F 這個掩碼,相關的文章很多。

 

dwP1 = *pDst;

dwP2 = *pSrc++;

                                         

dwP1 = (dwP1 | (dwP1<<16)) & 0X07E0F81F;

dwP2 = (dwP2 | (dwP2<<16)) & 0X07E0F81F;

dwP3 = (((dwP2 - dwP1)*a2>> 5) + dwP1) & 0X07E0F81F;

*pDst++= WORD((dwP3>> 16) | (dwP3 & 0XFFFF));

 

32位ARGB的話,也有一些小技巧, 下面的種一次計算2路的是從網上見到的一種:

 

dwSrc = *pSrc++;

dwDst = *pDst;

a= dwSrc>>24;

a1= 255-a;

dwRB = (dwSrc &0X00FF00FF)*a + (dwDst& 0X00FF00FF)*a1;

dwAG = ((dwSrc &0XFF00FF00)>>8)*a + ((dwDst & 0XFF00FF00)>>8)*a1;

*pDst++= ((dwRB & 0XFF00FF00) >> 8) | (dwAG & 0XFF00FF00);

 

總之ALPHA不用加速指令招數也就那幾招,可以說很有限。並且總的來說改善空間很小了,關鍵的還是要在控制混合運算的次數上下工夫。這就牽涉到髒矩形和物件的維護了,後面會重點討論這些。

 

ALPHA混合有一些值得注意的比如像GDI的設定關鍵色掩碼透明,直接COPY,常數ALPHA混合,ALPHA疊加等,這些在實現介面時都會碰到,並且要擇情況選擇合適的,讓效率達到最佳。這些在框架中都有實現,有需要的同學可以自己去查閱。

相關文章