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.根据得到的图片相关信息,利用上述代码读取图片数据显示

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值