歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

研究mgaview的源碼的成果

mgaview的源碼,看了幾遍之後,發現它的主要工作原理比較簡單,大致如下:

開始


打開圖片文件


讀取文件頭


判斷圖片類型


使用相應的函數解碼圖片為數組


調用相應的函數將數組寫入至屏幕


結束




源碼文件不怎麼多,也不是很復雜,並且,它的源碼還分類別存放在不同的文件夾:
src/
src/input
src/output

mgaview的主程序源碼當然就在src目錄,h格式的文件只是聲明了一些全局變量,還定義了一些宏。

input目錄

該目錄裡的源碼,是用於解碼各種格式的圖片文件,看文件名字就知道它具體是針對哪個格式的文件了,解碼後,會得到以下數據:
圖片的尺寸
圖片的位深度
還會得到三個 位數組:
一個是存儲每個像素點顯示的紅色(Red)的值
一個是存儲每個像素點顯示的綠色(Green)的值
一個是存儲每個像素點顯示的藍色(Blue)的值
圖片的尺寸決定這三個數組的長度。
只需要紅色、綠色、藍色這三種顏色就可以組合成任何顏色,學過初中物理的同學應該有印象。
可以參考這張截圖:

如圖所示,當紅色為255,綠色和藍色都為0的時候,這時的顏色是純紅色。
由此可知,當紅、綠、藍都為255的時候,會變成白色,0到255,顏色從深到淺。
那麼,在學習機屏幕上畫一張全屏白色的圖就很容易了,只需要將三個數組全部賦值為255,並傳給mgaview的相應函數既可顯示。


C語言代碼演示:
unsigned char image_r[2]={255,255};
unsigned char image_g[2]={255,255};
unsigned char image_b[2]={255,255};
這三段代碼表示的是兩個像素點顯示的顏色,內容都為255,也就是兩個像素點都顯示為白色。
每個顏色都有256種亮度,這樣算來,每個像素點一共可以顯示256*256*256=16777216種顏色,學習機的屏幕支持26萬色,而這1600萬色好像無法真正能完全顯示。

由以上可以聯想到:
我的學習機的屏幕的分辨率是320X240
320*240=76800個像素點
每個像素點由三個數組中對應的元素表示
而每個元素的長度都為1
76800*3*1=230400
之後
230400/1024=225KB
一張320*240的bmp圖片,它的大小為225KB(忽略文件頭信息,它會占一些空間),因為bmp是位圖,如果你看到一張圖片的大小恰好是225KB,那麼,它可能就是bmp圖片或者這種格式的圖片是直接保存像素點數據的。
當然,這是針對於沒有調色板的24位的BMP,24位的bmp是直接使用RGB,而有調色板的bmp,體積可能不會是225KB,它使用調色板中顏色索引值。

關於bmp圖片,可以看百科詞條:http://baike.baidu.com/view/7671.htm


output目錄
顧名思義,output,輸出,也就是顯示的意思,將位數組顯示到屏幕上,你可以看看裡面的源碼文件的內容,只有幾個C源碼文件和頭文件;
其中mga_vfb.c裡有個關鍵函數,它的原型是:void write_to_fb(uint8_t *r,uint8_t *g,uint8_t *b)
write_to_fb?寫入至設備fb?fb就是framebuffer。
裡面的r,g,b這三個指針就是指向傳入的三個數組(解釋可能不專業),這三個數組分別是表示每個像素點的紅、綠、藍三種顏色的深度,還有全局變量,所有函數共用的,並不是只傳三個數組就可以了,全局變量中還有表示圖片的寬度和高度的量。
其他的函數,看了一下,是處理圖片縮放、旋轉之類的函數,也就是修改數組的內容罷了。
Copyright © Linux教程網 All Rights Reserved