2007-7-19 13:38:26VC實現將圖片轉換為數組
上個學期,我嘗試過使用不帶字型檔的LCD12864模組。這種模組能顯示128x64像素的內容,顯示面積相當大,對學習單片機並用來開發介面可是很有吸引力的哦。
於是,我向個學長借了個過來用。開發平台是430。之所以用它,是因為它內部RAM大,還有相當快的速度,是51所不及的。再加上那塊430板,是一個即將畢業的研究生畫的,板上資源相當豐富,又小巧,我很喜歡。
對LCD12864模組來說,程式時序上沒有什麼大問題,只要按著資料手冊來,沒有什麼太大的難度。當時開始弄時,還是有點不自信,但這樣的東西,重要的就是是否有膽量參與進去,做一做。最終還是會有收穫的。430程式有機會再分享,這裡不展開。
主要是PC機上的圖片轉換工具。因為學習VC有一個學期左右了,很想挑戰下,把一張圖片轉換成LCD12864所能識別的資料類型。先介紹下LCD12864內部RAM的結構。螢幕上的128x64個像素分為兩個屏,左屏和右屏,分別是64x64像素的地區。對每一屏來說,每縱向的8個點便是一個位元組的資料。位元組中每一bit的值代表該位的亮與滅(因為使用的是無灰階級的模組)。這樣,整個屏的資料就可以用兩個大的數組來表示,每一數組得是512個位元組。
LCD12864是已經能顯示出來,但是只能顯示一些簡單的矩形。如何才能把圖片轉換成數組,便是我思考的問題。於是,就用VC實現了一個小程式。
程式中用了一個類,是直接借鑒《精通Visual C++.NET影像處理編程》裡的CDib類,是一個方便的能對映像讀寫操作的類。用它主要是為了使用的一個佛羅依德抖動演算法,該演算法可以將一個映像(彩色或灰階,灰階效果更好)轉為只用黑白點表示,較黑的地方黑點越密,較淺色的地方,黑點越稀鬆。這樣,得到的映像就可以按像素點轉化為相應的位元組資料,儲存出來即可。
下面的程式段是儲存像素的部分:
// For the left screen.
for(k = 0; k < 8; k++){ // LCD page
for (j = 0; j < 64; j ++){ // LCD coloum
for(i = 0; i < 8; i++){ // LCD row
if(m_desDC.GetPixel(j, i + k * 8) == RGB(0, 0, 0)){
ucCS1[k][j] |= 0x01 << i;
}
}
}
}
採用移位的方式,將8個點的資訊存為一個位元組。
程式最終介面如下,還有產生的資料檔案。
程式目前還有些小bug,比如開啟圖片後,當程式介面重繪時就顯示不出圖片。試過很多辦法,比如在MFC的OnPaint函數裡回入繪圖時,程式會變得很慢,它會一直在重繪。或是其它的比如active等類型的函數裡加過,也沒有。有機會再完善點吧,畫圖怎麼說都是視窗系統的優勢啊,掌握好畫圖也是項不錯的技術。
Tags: VC 映像