關於顏色格式的一些心得

2021-04-12 22:19:36 字數 2301 閱讀 2368

大自然中的顏色和計算機世界裡的顏色,頗有許多相似之處,甚至可以說計算機世界裡的顏色就是來自大自然的。我記得我的一位師長曾對我說:「科學源於生活又低於生活,藝術源於生活而高於生活」。現在想起來,似乎真的是這個樣子。

大自然中的顏色有多少種呢?

不知道唉,可以說是無數種了。

不過既然科學源於生活又低於生活,那麼計算機中的顏色肯定就少於無數種(作者廢話,被暴打中.......)

一般我們的計算機的顏色,通常有兩種格式,一種是16bit格式,一種是32bit格式。

開啟顯示屬性面板,在「setting」裡看color quality就會發現你計算機支援的顏色格式了,我的計算機顯示medium(16 bit)和hightest(32bit)兩種,有些計算機也許還可能顯示low(8bit)吧。

關於8bit和小於8bit的顏色格式,設計到調色盤問題,個人認為現在的計算機配置都很高,所以不用調色盤也完全可以,所以不說了(其實自己也不知道調色盤到底怎麼回事)

16bit格式有兩種

565 format: rrrr rggg gggb bbbb(從左到右,記憶體位址減小,和下面所說的順序相反)

555 format: 0rrr rrgg gggb bbbb

不同的顯示卡支援的格式不太一樣,如果在16bit格式下編寫涉及顏色的程式的話,

最好提前知道顯示卡支援的格式型別,免得賦值的時候出錯。

我知道一種方法就是directdraw7裡面有乙個getpixelformat的函式,可以得到當前顯示卡支援的顏色格式。不過,我們通常的顏色操作都是在32bit 下進行的。

這裡存在這一種24bit的格式,實際上,單純的從顏色深度的角度講,24bit 和32bit是一樣的,只是32bit的格式比24bit多了乙個阿拉法位,如果用direct3d編寫遊戲,會用到這一位,一般編寫2維的程式,是用不到的。而且在計算機的世界裡,3可是乙個很討厭的數字,即使乙個數字只需要3個位元組,可實際上在記憶體裡面,實際上也是佔4個位元組的。

在微軟提供的開發平台vs.net環境下

經常會遇到如下幾種設計到顏色的格式和巨集                  

名稱型別

位元組定義

格式(記憶體中,從左到右,位址增大)   

colorref 

32bit整數 

4  r g b 0

rgb巨集 

3  (b<<16|g<<8|r)

r g b 0

rgbquad

結構體4

成員變數為rgbblue

rgbgreen , rgbred ,

rgbreserved

b g r re

rgb_24 巨集3 

(r<<16|g<<8|b)

b  g  r  0

rgb_32巨集 4

(a<<24|r<<16|g<<8|b)

b  g  r  a 

可以看出,雖然都是表示顏色的值,但是在記憶體裡儲存的方式確實不一樣的,

我上面所列出的格式,是按照記憶體位址從小到大的順序列出的,

以rgb_32為例,其中 b分量的所在位元組的位址值是最小的,而a分量的位元組的位址值比b分量的位址大3個值,上面所列出的值大致分為兩大陣營,前兩個是乙個陣營,後三個是乙個陣營,因為他們在記憶體裡的儲存順序的不同,所以如果用的地方不對,就會出錯。

就我的經驗來看,如果用cdc編寫程式,用第一陣營的兩個顏色表達方式,如果用directdraw編寫程式,用rgb_24這種格式,比如

buffer 這種鎖定操作,直接賦rgb_24就非常的方便了,你如果賦的是rgb,那麼除非把 r,g,b的順序顛倒一下,否則,得到的顏色,肯定不是你想要的(rgb三個分量相等除外)

如果用direct3d程式設計,那麼也許rgb_32是個不錯的選擇,不過我還沒用過

如果對乙個bmp檔案(現在大多數的bmp都是24bit的)進行讀取操作,那麼我建議用

rgbquad,因為它是乙個結構體,可以直接把每乙個位元組的值賦給相應分量的值,使用起來很方便的

另外在這羅嗦一句,關於24- bit bmp檔案的顏色儲存格式,如果你已經把檔案的所以資料讀到記憶體裡面了,

那麼,每乙個象素點,在記憶體中的儲存格式為 b g r

有人會問了,那麼這豈不是只有3個位元組麼?不是和上面所說的矛盾了?

其實這些點在記憶體中是連續儲存的,實際的格式是 b g r b g r ........

如果乙個bmp檔案的象素大小是nwidth*nheight的話,

那麼象素矩陣實際上佔的位元組數是:(((nwidth+31)>>4)<<4)*nheight

所以,無論象素大小是多少,所佔記憶體的大小始終是16的倍數的

會有很多收穫的。

水平有限,如有不妥之處,請達人不吝賜教。

關於Web Worker的一些心得

現在在平台中線程js中不能識別extjs的方法,原因是執行緒js無法引入extjsd的方法。onmessage只接收資料,不能在裡面直接寫方法,只能呼叫外面的方法 webwork.js無法訪問window,docment等物件 案例 建立乙個執行緒 varworker newworker test ...

一些關於BFC的心得

bfc的概念 什麼是bfc?bfc 塊級格式化上下文是前端頁面的視覺化css渲染的一部分,是布局過程中生成塊級盒子的區域,也是浮動元素與其他元素的互動限定區域。在bfc中,盒子從頂端開始垂直的乙個接乙個的排列,兩個盒子之間的垂直的間隔是由他們的margin值決定的,在乙個bfc中,兩個相鄰的塊級盒子...

關於租房的一些心得

在下畢業於2020年7月,畢業後找了兩份工作,產生了一些由於不慎重而導致的損失。這裡提醒一些剛開始租房還沒有退房的小夥伴幾點一定要注意的,不要因為想當然而把房子借給別人 不要因為想當然而給別人好處,特別的鄰居,因為當出現問題時他們未必會幫你,並且會對你的要求厭煩 應該在自己人在場時退房而不能等到離開...