日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

emwin从外部flash中读取bmp图片显示

發布時間:2024/3/26 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 emwin从外部flash中读取bmp图片显示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在emwin中有提供了一個從外部讀取圖片數據進行顯示的函數,如下:

而且提供了官方例程,不過官方歷程中從外部讀取是從外部文件系統中進行讀取的bmp圖片進行顯示,官方例程如下

/* ********************************************************************************************************* * 函 數 名: _GetData * 功能說明: 被函數 GUI_BMP_DrawEx 調用 * 形 參: p FIL 類型數據 * NumBytesReq 請求讀取的字節數 * ppData 數據指針 * Off 如果 Off = 1,那么將重新從起始位置讀取 * 返 回 值: 返回讀取的字節數 ********************************************************************************************************* */ int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) { static int FileAddress = 0; UINT NumBytesRead; FIL *PicFile; PicFile = (FIL *)p; /* * 檢測緩存大小 */ if (NumBytesReq > sizeof(acBuffer)) { NumBytesReq = sizeof(acBuffer); } /* * 設置讀取位置 */ if(Off == 1) FileAddress = 0; else FileAddress = Off; result =f_lseek(PicFile, FileAddress); /* * 讀取數據到緩存 */ result = f_read(PicFile, acBuffer, NumBytesReq, &NumBytesRead);/* * 讓指針 ppData 指向讀取的數據 */ *ppData = (const U8 *)acBuffer; /* * 返回讀取的字節數 */ return NumBytesRead; } /* ********************************************************************************************************* * 函 數 名: _ShowBMP1 * 功能說明: 顯示 BMP 圖片 * 形 參: sFilename 要讀取的文件名 * 返 回 值: 無 ********************************************************************************************************* */ void _ShowBMP1(const char *sFilename) { /* 打開文件 */ result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); if (result != FR_OK) { return; } /* 繪制 BMP 圖片 */ GUI_BMP_DrawEx(_GetData, &file, 0, 0); /* 關閉文件 */ f_close(&file); }

關鍵部分就是從回調函數中讀取bmp圖片的數據。例程中時從外部文件按系統中進行讀取,如果我們想從外部flash中直接讀取的話,只需要在回調函數中對讀取bmp數據部分進行簡單修改就可以了

/* ********************************************************************************************************* * 函 數 名: _GetData * 功能說明: 被函數 GUI_BMP_DrawEx 調用 * 形 參: p 圖片參數 * NumBytesReq 請求讀取的字節數 * ppData 數據指針 * Off 如果 Off = 1,那么將重新從起始位置讀取 * 返 回 值: 返回讀取的字節數 ********************************************************************************************************* */ 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;}/** 檢測緩存大小*/if (NumBytesReq > sizeof(p_pic_buf)) {NumBytesReq = sizeof(p_pic_buf);}/** 設置讀取位置*/if(Off == 1) Off = 0;else Off = Off;//result =f_lseek(PicFile, FileAddress);/**** 讀取數據到緩存*///result = f_read(PicFile, acBuffer, NumBytesReq, &NumBytesRead);/**GT24_FREE_FLASH_PIC_START_ADDR是flash中劃分來存儲bmp圖片的起始地址,p_flash_pic->address是要顯示的bmp圖*相對于GT24_FREE_FLASH_PIC_START_ADDR的偏移地址,是從回調函數中第一個參數傳進來的*/uint32_t current_addr = GT24_FREE_FLASH_PIC_START_ADDR + p_flash_pic->address + (offset==1?0:offset);/**讀取函數是自己創建的通過spi從flash讀取指定字節大小的函數,這個可以根據自己的實際情況來定*/ret = gt24_read_nbytes(p_pic_buf, current_addr, NumBytesReq);/** 讓指針 ppData 指向讀取的數據*/*ppData = (const U8 *)p_pic_buf;/** 返回讀取的字節數*/return NumBytesReq; } /* ********************************************************************************************************* * 函 數 名: _ShowBMP1 * 功能說明: 顯示 BMP 圖片 * 形 參: sFilename 要讀取的文件名 * 返 回 值: 無 ********************************************************************************************************* */ void _ShowBMP1(void) {/* 繪制 BMP 圖片 ,file 是傳進去的flash中的圖片相關的參數,可以在Getdata中的第一個形參中得到*/GUI_BMP_DrawEx(_GetData, &file, 0, 0); }

到這里,就完成了從外部flash中讀取圖片信息進行顯示的整個過程了,除了從外部flash中讀取bmp圖片,還可以從外部flash中讀取gif圖片,也只需要將emwin提供的官方例程中的回調函數中的數據讀取部分改為flash讀取函數即可,同樣要是想從外部flash中讀取XBF字庫文件,也是一樣。
讀取顯示的流程:
1.制作圖片數據bin文件,我在bin文件前面會保存每張圖片的相關信息,包括圖片大小,圖片數據偏移量(圖片在bin文件中的位置),圖片名字;我用一個結構體來保存一張圖片的上述數據;也就是說假如有5張圖片,在bin的開始部分會保存5個包含圖片信息的結構體,后面跟著的再是5張圖片的完整數據(bmp頭、信息頭、顏色表(有的話)、圖片有效數據)。
2.將bin文件寫入flash中,方式有很多種,可以通過利用串口通過xmodem寫入flash,也可以利用手機app通過藍牙下發bin文件,寫入flash中。
3.根據文件名遍歷bin文件,每次讀取一個結構體大小的數據量,直到找到相對應文件名的結構體,得到對應圖片的相關信息,得到圖片的名字、大小,以及偏移量(圖片在bin文件中的位置),圖片類型,這個結構體就是傳入GUI_BMP_DrawEx函數的第二個形參,也就是getdata函數的第一個形參。
4.根據得到的圖片相關信息,利用上述代碼讀取圖片數據顯示

總結

以上是生活随笔為你收集整理的emwin从外部flash中读取bmp图片显示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。