1.關(guān)于屏幕的一點(diǎn)麻煩事
遇到一個(gè)問(wèn)題:我們開(kāi)發(fā)的嵌入式設(shè)備的屏幕是16位色的,,這在通常情況下問(wèn)題不大,,但顯示顏色豐富的圖形時(shí),可能就非常糟糕,。 后來(lái)百了一度,,得知acdsee有更好的算法,它加入了抖動(dòng)的處理(用幾個(gè)像素點(diǎn)的色彩去逼近初始色彩)……果然,,效果不錯(cuò),。 下面的圖中,,左邊是放大5倍后查看的效果,右邊是100%顯示,。
如果你的顯示器看不出這幾張圖之間的差異,呵呵,,我向你表示深切的同情和問(wèn)候,。 adobe對(duì)新媒體的反映總是相當(dāng)?shù)倪t鈍,。web興起的時(shí)候,它沒(méi)有抓住機(jī)遇,,最后自己也承認(rèn)是憑借設(shè)計(jì)師對(duì)photoshop的喜愛(ài)和習(xí)慣,,才僥幸沒(méi)被淘汰。
現(xiàn)在又有一個(gè)新的趨勢(shì)出現(xiàn),,那就是普適計(jì)算,,很多設(shè)備都將擁有屏幕,而內(nèi)容將被分發(fā)到各種類(lèi)型的終端上,。你不可能要求那些終端都是頂級(jí)顯示屏,,它們的分辨率、顏色數(shù),、對(duì)比度……可以說(shuō)會(huì)是千差萬(wàn)別,,開(kāi)發(fā)工具做好相應(yīng)的準(zhǔn)備了嗎? 2.
windows mobile下的位圖
在WM(Windows Mobile)下的位圖有一定的特殊性,,可操作API也不多,,所以這里重點(diǎn)講解一下WM的位圖知識(shí),但不對(duì)位圖文件的格式做重點(diǎn)介紹,。才疏學(xué)淺,,特別歡迎高人指正。如果你要看懂這篇文章,,需要有一定的基礎(chǔ),,并對(duì)位圖有實(shí)際操作經(jīng)歷,因?yàn)槲也粫?huì)詳述基礎(chǔ)知識(shí),。 眾說(shuō)周知,,程序中Windows標(biāo)準(zhǔn)的圖像處理使用的都是BMP格式。在WM下也不例外,,所有被存儲(chǔ)的圖形都是BMP,,并且所有windows mobile系列的手機(jī)只支持65536色,這就是意味著,,手機(jī)上顯示的圖像都是16位的,,那么在實(shí)際的程序中,創(chuàng)建一個(gè)DIB時(shí),,用16位位圖是比較現(xiàn)實(shí)的,,圖像文件也建議都改成16位的格式。16位的位圖在顯示上特別是在出現(xiàn)大區(qū)域,,高相位的慚變操作時(shí),,會(huì)出現(xiàn)色差,造成慚變不連續(xù)的問(wèn)題,。通過(guò)抖動(dòng)算法會(huì)處理掉色差,,但會(huì)降低原32位色的純度,。這就是65536色的問(wèn)題
因此,在做WM界面設(shè)計(jì)時(shí),,盡量不要使用大區(qū)域,,高相位的慚變?cè)O(shè)計(jì)。
WM中的位圖分為DDB和DIB,。
DDB叫做設(shè)備相關(guān)位圖,,一般用來(lái)做WM軟件界面的交換和提取。并對(duì)圖片執(zhí)行一些簡(jiǎn)單的操作,,比如截屏,,縮放,顯示,。使用bitblt或strechblt這些函數(shù)搗騰的位圖,,很多是設(shè)備相關(guān)位圖,一般此類(lèi)位圖都與HDC相關(guān),。并且只能在內(nèi)存中,,不能以文件的形式存出來(lái)。在WM下,,無(wú)法直接取到DDB位圖的像素的RGB陣列
DIB叫做設(shè)備無(wú)關(guān)位圖,,一般界面上很少用到,但在做一些較復(fù)雜的界面特效時(shí)會(huì)用到DIB位圖,,它的最大的特點(diǎn)就是能夠取到像素的RGB陣列,,從而通過(guò)對(duì)這個(gè)陣列的操作,改變圖形顯示的效果,。并且能夠存為.BMP文件,。所有.BMP格式的文件都是DIB位圖,在WM的內(nèi)存中只能通過(guò)CreateDIBSection來(lái)創(chuàng)建有DIB特點(diǎn)的位圖,。網(wǎng)上有很多對(duì)這個(gè)Section的解釋?zhuān)f(shuō)是DDB和DIB的混合體,。不懂,我就把它當(dāng)DIB位圖來(lái)看了,。創(chuàng)建這個(gè)位圖有很多參數(shù),。我揀緊要的說(shuō)一下:
先看代碼:
//建立這個(gè)位圖的內(nèi)存空間,并初始化結(jié)構(gòu),這個(gè)指針是要做CreateDIBSection參數(shù)的
int iSize = sizeof(BITMAPINFO)
BITMAPINFO* pBMI = (BITMAPINFO*) malloc(iSize);
memset(pBMI, 0, iSize);
// 填充結(jié)構(gòu)數(shù)據(jù),,BITMAPINFO結(jié)構(gòu)里面帶一個(gè)BITMAPINFOHEADER結(jié)構(gòu),,和一個(gè)調(diào)色板或掩碼
pBMI->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBMI->bmiHeader.biWidth = 2048;//位圖寬,單位是像素
pBMI->bmiHeader.biHeight = 512;//位圖高,,單位是像素
pBMI->bmiHeader.biPlanes = 1; //不懂,,只能設(shè)1
pBMI->bmiHeader.biBitCount = 16; // 位深,就是一個(gè)像素用幾個(gè)位來(lái)表示,這是16位,2的16次方就是65536,所以說(shuō)16位只能表示65536種色彩
//pBMI->bmiColors;//對(duì)這個(gè)參數(shù)我很無(wú)語(yǔ),。用不來(lái),我的理解:這個(gè)參數(shù)在16位以下,,不包括16位的數(shù)據(jù)格式用的是調(diào)色板,,就是一個(gè)表,存上了圖像中所有要用的像素RGB值,。在16位以上,,包括16位的數(shù)據(jù)格式就是每個(gè)像素的掩碼值,每個(gè)像素的RGB值會(huì)與這個(gè)掩碼做與運(yùn)算一次。因?yàn)?6位以上的數(shù)據(jù)就沒(méi)有調(diào)色板了,。所以這里的數(shù)據(jù)只記錄RGB三色的掩碼,,但是沒(méi)有格式的說(shuō)明。
//pBMI->bmiHeader.biCompression = BI_BITFIELDS; //壓縮屬性
pBMI->bmiHeader.biCompression = BI_RGB; // 壓縮屬性
BYTE* pBits ;
HBITMAP hbitmapTexture = CreateDIBSection( hdc,
pBMI,
DIB_RGB_COLORS,
//DIB_PAL_COLORS,//只能在8位色深上可用,,使用系統(tǒng)DC的調(diào)色板
(VOID **) &pBits,
NULL,
0);
代碼中BITMAPINFOHEADER結(jié)構(gòu)中還有一些數(shù)據(jù)沒(méi)有填,,直接默認(rèn)為初始值,具體的查閱一下MSDN,。在對(duì)biCompression格式設(shè)定要注意:當(dāng)biCompression設(shè)為BI_RGB時(shí),,我這個(gè)DIB位圖的像素RGB陣列就只能是555格式,后面pBMI->bmiColors這個(gè)參數(shù)就可以直接默認(rèn)初始值了,當(dāng)設(shè)為BI_BITFIELDS,可能是555,也可能是565,事實(shí)上我認(rèn)為createdibsection創(chuàng)建成的DIB位圖就是RGB555的格式,,沒(méi)有565,。待解!
這樣一個(gè)沒(méi)有數(shù)據(jù)的DIB的hbitmap就創(chuàng)建出來(lái)了,,當(dāng)你bitblt一個(gè)選內(nèi)這個(gè)DIB位圖的內(nèi)存DC時(shí),,pBits的數(shù)據(jù)就被填充了,就能夠得到像素RGB陣列了,,這個(gè)方法也可以轉(zhuǎn)換一個(gè)DDB成為DIB,。
特別指明的是在使用SHLoadImageFile函數(shù)加載圖像數(shù)據(jù)時(shí),無(wú)論你使用是什么位深,,都會(huì)轉(zhuǎn)換為16位,,并且能獲得的bitmap格式中的pBits像素?cái)?shù)據(jù)(DDB位圖中pBits數(shù)據(jù)是空的)。采用RGB565格式正序排列的,,在photoshop中,,存出的位圖默認(rèn)是以倒行序排列的,當(dāng)在存儲(chǔ)時(shí)有一個(gè)翻轉(zhuǎn)行序選項(xiàng)時(shí),,選上后存儲(chǔ)才是正行序排列像素?cái)?shù)據(jù),。
當(dāng)在使用CreatDIBSection函數(shù)創(chuàng)建設(shè)備無(wú)關(guān)位圖數(shù)據(jù)時(shí),也是倒行序,。
本文來(lái)自CSDN博客,,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/kekobobo/archive/2009/10/28/4740360.aspx
|
|
來(lái)自: woada > 《我的圖書(shū)館》