STemWin 流位圖Stream Bitmap的介紹 [2]

前言

  1. 本博文基於emWin5.50 ,MDK環境下實現;
  2. 本博文介紹流位圖(stream Bitmap)和創建位圖結構體的過程;
  3. 如有不足之處,多指教;

什麼是流位圖(stream Bitmap)

流位圖也可以叫以流形式的位圖或者流式位圖;想象一下,假如一個單片機的RAM只有64KB,我們想要從SD卡里獲取一個150KB的Bitmap或者其他文件,這個時候顯然不能先將150KB的圖片全部讀取到RAM,只能吧150KB的Bitmap分成好幾段,所以就形成了一種流一樣的傳輸方式;流位圖還可以理解爲一個包含完整位圖數據的.dta的文件(開頭爲0x42和0x4d的那個.dta文件,用WinHex可以查看,看下圖)。
在這裏插入圖片描述

流位圖的存儲和獲取

流位圖數據的存儲: 單片機的RAM,ROM和外部存儲器;在內部以數組元素,二進制的形式存儲,外部以.dta或其他的形式存在(.dta形式的文件時以文件系統爲基礎的,如果外部存儲器並沒有搭載文件系統,這需要在程序裏標記.dta的起始位置和大小,這是很繁瑣的);
在這裏插入圖片描述

流位圖數據的獲取:
當在屏幕上繪製流位圖時,數據可以從內存獲取,也可以從外部存儲器獲取;爲此emWin專門封裝了兩種繪製流位圖的函數,帶…Ex()的函數爲獲取外部流位圖的函數,不帶的則是內部的;當數據從外存中獲取時的流程是:外存 → RAM → LCD屏幕。
當從內部獲取時:
辦法1:用GUI_DrawStreamedBitmap() 和GUI_DrawStreamedBitmapAuto()函數;
辦法2:以位圖爲基礎創建一個相應的GUI_BITMAP結構體,通過GUI_DrawBitmap()進行調用(普通方法);
在這裏插入圖片描述

從外部存儲器獲取時: …Ex()
以外部設備讀寫函數爲基礎,建立一個GetData()函數,將位圖數據先轉移到RAM,再寫在LCD上(如下圖),這時就有可能出現內部RAM不夠的情況,建議使用動態內存分配的方法;
在這裏插入圖片描述
若用戶不知道所要獲取的流位圖文件是什麼格式,則使用GUI_DrawStreamedBitmapExAuto();
若用戶知道,則可以用指定的流位圖繪製函數GUI_DrawStreamedBitmapxxxxEx()獲取xxxx類型的流位圖文件,這種方式更節省內存;
…Ex()函數要求有足夠的RAM空間,用來存儲至少1行共來自外部存儲的位圖的像素數據,若RAM不足,函數將立即返回,並不會再LCD有所操作;

emWin指導手冊對於繪製流位圖的介紹:
在這裏插入圖片描述
不是所有的尾部文件的獲取都支持:(如下圖)
在這裏插入圖片描述

流位圖的創建

int GUI_CreateBitmapFromStream(GUI_BITMAP * pBMP, GUI_LOGPALETTE * pPAL, const void * p);

描述: 根據參數p傳進來的位圖數據流,並判斷是哪種位圖,最後初始化pBMP和pPAL所指向的結構體;
參數:
pBMP :指向被此函數初始化的位圖結構體;
pPAL:指向被此函數初始化的位圖調色板結構體;
p:** 指向一個完整的任意格式類型的流位圖文件的數據(就是位圖數據流)**;
返回: 1則失敗,0則成功;
用法: 此函數用於當p所指向的位圖流由多種位圖格式或未知格式組成時。此函數的弊端是什麼比較消耗內存,若考慮ROM則建議使用指定格式類型的對應函數來創建 (GUI_CreateBitmapFromStreamxxx()),詳情看下面手冊截圖;
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章