dui框架開發系列:32位和565BMP的ALPHA混合和資源打包
大家好,我要介紹的所有知識點都是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疊加等,這些在實現介面時都會碰到,並且要擇情況選擇合適的,讓效率達到最佳。這些在框架中都有實現,有需要的同學可以自己去查閱。
相關文章
- Android和js的混合開發AndroidJS
- Flutter 和iOS 混合開發(一)FlutteriOS
- 原生開發、H5開發和混合開發的區別H5
- 如何實現混合 App Web 資源的打包與增量更新APPWeb
- 遊戲開發學堂:2D模式下的alpha混合(轉)遊戲開發模式
- Flutter Boost 混合開發框架初探Flutter框架
- java和.net 雙語言開發框架,開源的PaaS平臺Java框架
- kotlin和java混合開發總結KotlinJava
- 史上最全的開發和設計資源大全
- android開源專案和框架Android框架
- 11 個 AI 和機器學習模型的開源框架AI機器學習模型框架
- 22.原生專案和Flutter的混合開發(三)Flutter
- 20.原生專案和Flutter的混合開發(一)Flutter
- 21.原生專案和Flutter的混合開發(二)Flutter
- android開源專案和框架(轉)Android框架
- 構建屬於自己的Flutter混合開發框架Flutter框架
- 混合APP開發MUI框架書目錄APPUI框架
- Vue如何使用混合Mixins和外掛開發Vue
- Flutter完整開發實戰詳解(十四、混合開發打包 Android 篇)FlutterAndroid
- 視覺化編排的資料整合和分發開源框架Nifi輕鬆入門-上視覺化框架Nifi
- 元宇宙7個開源工具和框架讓開發不用從零開始元宇宙開源工具框架
- webpack + Vue + Hbuilder 打包成App,混合app開發,一個人搞定WebVueUIAPP
- 安卓開發框架系列開篇安卓框架
- [系列] Gin框架 - 資料繫結和驗證框架
- Qt混合Python開發技術:Python介紹、混合過程和DemoQTPython
- vue多頁面開發和打包的正確姿勢Vue
- Swift開發開源框架KatanaSwift框架
- 史上最全的開發和設計資源大全(轉--------來源:伯樂線上)
- EOS開發平臺和框架薦框架
- Java開源框架發展的遐想Java框架
- 「Mybatis系列」Mybatis開發方式和配置MyBatis
- 已開源|碼上用它開始Flutter混合開發——FlutterBoostFlutter
- 碼上用它開始Flutter混合開發——FlutterBoost | 已開源Flutter
- 開源 Amundsen:資料發現和後設資料平臺
- 優酷鴻蒙開發實踐|優酷 Android 與HarmonyOS Hap 混合打包鴻蒙Android
- Flutter與Native混合開發-FlutterBoost整合應用和開發實踐(iOS)FlutteriOS
- 前端開發必看的幾個開源框架!前端框架
- 微服務、CQRS和eventsourcing開源資源微服務