emwin从外部flash中读取bmp图片显示
在emwin中有提供了一個(gè)從外部讀取圖片數(shù)據(jù)進(jìn)行顯示的函數(shù),如下:
而且提供了官方例程,不過官方歷程中從外部讀取是從外部文件系統(tǒng)中進(jìn)行讀取的bmp圖片進(jìn)行顯示,官方例程如下
關(guān)鍵部分就是從回調(diào)函數(shù)中讀取bmp圖片的數(shù)據(jù)。例程中時(shí)從外部文件按系統(tǒng)中進(jìn)行讀取,如果我們想從外部flash中直接讀取的話,只需要在回調(diào)函數(shù)中對(duì)讀取bmp數(shù)據(jù)部分進(jìn)行簡(jiǎn)單修改就可以了
/* ********************************************************************************************************* * 函 數(shù) 名: _GetData * 功能說明: 被函數(shù) GUI_BMP_DrawEx 調(diào)用 * 形 參: p 圖片參數(shù) * NumBytesReq 請(qǐng)求讀取的字節(jié)數(shù) * ppData 數(shù)據(jù)指針 * Off 如果 Off = 1,那么將重新從起始位置讀取 * 返 回 值: 返回讀取的字節(jié)數(shù) ********************************************************************************************************* */ int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) {image_params_t *p_flash_pic= (image_params_t *)p;if ((Off + NumBytesReq) > p_flash_pic->size){NRF_LOG_ERROR("Params error 0");NumBytesReq= p_flash_pic->size - Off;}/** 檢測(cè)緩存大小*/if (NumBytesReq > sizeof(p_pic_buf)) {NumBytesReq = sizeof(p_pic_buf);}/** 設(shè)置讀取位置*/if(Off == 1) Off = 0;else Off = Off;//result =f_lseek(PicFile, FileAddress);/**** 讀取數(shù)據(jù)到緩存*///result = f_read(PicFile, acBuffer, NumBytesReq, &NumBytesRead);/**GT24_FREE_FLASH_PIC_START_ADDR是flash中劃分來存儲(chǔ)bmp圖片的起始地址,p_flash_pic->address是要顯示的bmp圖*相對(duì)于GT24_FREE_FLASH_PIC_START_ADDR的偏移地址,是從回調(diào)函數(shù)中第一個(gè)參數(shù)傳進(jìn)來的*/uint32_t current_addr = GT24_FREE_FLASH_PIC_START_ADDR + p_flash_pic->address + (offset==1?0:offset);/**讀取函數(shù)是自己創(chuàng)建的通過spi從flash讀取指定字節(jié)大小的函數(shù),這個(gè)可以根據(jù)自己的實(shí)際情況來定*/ret = gt24_read_nbytes(p_pic_buf, current_addr, NumBytesReq);/** 讓指針 ppData 指向讀取的數(shù)據(jù)*/*ppData = (const U8 *)p_pic_buf;/** 返回讀取的字節(jié)數(shù)*/return NumBytesReq; } /* ********************************************************************************************************* * 函 數(shù) 名: _ShowBMP1 * 功能說明: 顯示 BMP 圖片 * 形 參: sFilename 要讀取的文件名 * 返 回 值: 無 ********************************************************************************************************* */ void _ShowBMP1(void) {/* 繪制 BMP 圖片 ,file 是傳進(jìn)去的flash中的圖片相關(guān)的參數(shù),可以在Getdata中的第一個(gè)形參中得到*/GUI_BMP_DrawEx(_GetData, &file, 0, 0); }到這里,就完成了從外部flash中讀取圖片信息進(jìn)行顯示的整個(gè)過程了,除了從外部flash中讀取bmp圖片,還可以從外部flash中讀取gif圖片,也只需要將emwin提供的官方例程中的回調(diào)函數(shù)中的數(shù)據(jù)讀取部分改為flash讀取函數(shù)即可,同樣要是想從外部flash中讀取XBF字庫文件,也是一樣。
讀取顯示的流程:
1.制作圖片數(shù)據(jù)bin文件,我在bin文件前面會(huì)保存每張圖片的相關(guān)信息,包括圖片大小,圖片數(shù)據(jù)偏移量(圖片在bin文件中的位置),圖片名字;我用一個(gè)結(jié)構(gòu)體來保存一張圖片的上述數(shù)據(jù);也就是說假如有5張圖片,在bin的開始部分會(huì)保存5個(gè)包含圖片信息的結(jié)構(gòu)體,后面跟著的再是5張圖片的完整數(shù)據(jù)(bmp頭、信息頭、顏色表(有的話)、圖片有效數(shù)據(jù))。
2.將bin文件寫入flash中,方式有很多種,可以通過利用串口通過xmodem寫入flash,也可以利用手機(jī)app通過藍(lán)牙下發(fā)bin文件,寫入flash中。
3.根據(jù)文件名遍歷bin文件,每次讀取一個(gè)結(jié)構(gòu)體大小的數(shù)據(jù)量,直到找到相對(duì)應(yīng)文件名的結(jié)構(gòu)體,得到對(duì)應(yīng)圖片的相關(guān)信息,得到圖片的名字、大小,以及偏移量(圖片在bin文件中的位置),圖片類型,這個(gè)結(jié)構(gòu)體就是傳入GUI_BMP_DrawEx函數(shù)的第二個(gè)形參,也就是getdata函數(shù)的第一個(gè)形參。
4.根據(jù)得到的圖片相關(guān)信息,利用上述代碼讀取圖片數(shù)據(jù)顯示
總結(jié)
以上是生活随笔為你收集整理的emwin从外部flash中读取bmp图片显示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: E112强制认证
- 下一篇: STM32F429入门(二十一):SPI