硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4133|回复: 8
收起左侧

[emWin] emWin显示存储在外部SPI Flash的图片

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2018-9-24 07:17:13 | 显示全部楼层 |阅读模式
本帖最后由 yuneizhilin 于 2018-9-24 07:32 编辑

后缀是dta的图片存在外部的SPI flash 里面  没有文件系统 ,将图片显示出来,大家有没有合适的例程参考一下.
另外,调用GUI_DrawStreamedBitmapEx函数时,回调函数_GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)的NumBytesReq大小是16,如何设置的大点,还有off一直为0,不知道什么原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-9-24 09:47:51 | 显示全部楼层
NumBytesReq大小是系统决定的,有可能跟你设置图片长度有关。

这个方式暂无参考例程。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2018-9-24 14:50:11 | 显示全部楼层
eric2013 发表于 2018-9-24 09:47
NumBytesReq大小是系统决定的,有可能跟你设置图片长度有关。

这个方式暂无参考例程。

参数off代表什么意思?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-9-24 15:27:47 | 显示全部楼层
yuneizhilin 发表于 2018-9-24 14:50
参数off代表什么意思?

offset,偏移地址。

如果没记错的话。
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2019-7-2 09:21:02 | 显示全部楼层
哈喽,这种方法可行吗?我也正在试图这样实现,因为内存不够,图片放数组太耗内存了
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2019-7-2 14:01:05 | 显示全部楼层
我现在正在做个项目,图片存在外部SPI FLASH,使用的时候先将dta文件加载到内存,然后显示。
第一步定义一个读取图片数据流到内存的函数。

QQ图片20190702134900.png

第二步在需要设置图片的地方,将图片设置到控件上。
有些控件只能设置bmp格式,需要将dta转换为bmp格式,如:
QQ图片20190702135010.png

有些控件可以直接设置dta格式,就不需要上面的转换了。

第三步,使用完成要释放分配的内存。
QQ图片20190702135500.png

这个方法需要内存足够大,可以分配足够的空间,将dta文件读取到内存。

另外一个办法就是用带Ex后缀的函数,可以直接从外部获取数据,不经过内存,获取一部分显示一部分。缺点是显示慢。
需要注意的地方是,如果用了png库,则回调函数中的 buff 指针不需要修改,直接用就可以了。
如果不是png格式 的图片,那回调函数里的 buff 指针是随机值,需要在回调函数里给赋值,然后再使用。
off 参数是偏移量,告诉回调函数当前调用要从文件的 哪个偏移位置开始读取。

具体可以看帖子 http://www.armbbs.cn/forum.php?mod=viewthread&tid=93844
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-7-2 15:13:10 | 显示全部楼层
ihavedone 发表于 2019-7-2 14:01
我现在正在做个项目,图片存在外部SPI FLASH,使用的时候先将dta文件加载到内存,然后显示。
第一步定义一 ...

你的xxxZero应该改成NoZero,否则太影响性能了。

完全没必要Zero
代码不规范,亲人两行泪!
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2019-7-2 15:33:31 | 显示全部楼层
missfox 发表于 2019-7-2 15:13
你的xxxZero应该改成NoZero,否则太影响性能了。

完全没必要Zero

是的,按道理是没必要Zero,我改一下试试。。。当时是随便选了一个自动补齐的函数。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-10-12 08:33:37 | 显示全部楼层
char _ShowAngleBitMap(char _Item)
{
        u32 _ReadAddr=0x20000;
        GUI_HMEM hMem;
        uint8_t *_acBuffer;
        uint8_t _acBuffer2[4];
        int size=1024*10;                //hope small than 16KB
       
        if(0 == _Item) _ReadAddr = 0x20000;
        else if(1 == _Item) _ReadAddr = 0x28000;
        else if(2 == _Item) _ReadAddr = 0x30000;
       
        SPI_FLASH_BufferRead(_acBuffer2, _ReadAddr, 2);
        if((0x42 ==_acBuffer2[0])&&(0x4d ==_acBuffer2[1]))//dta file
        {
                hMem = GUI_ALLOC_AllocZero(size);
                /*把申请到的内存转换成指针*/
                _acBuffer = GUI_ALLOC_h2p(hMem);
                SPI_FLASH_BufferRead(_acBuffer, _ReadAddr, size);
                if(0 == _Item) GUI_DrawStreamedBitmapAuto(_acBuffer, 5, 133);
                else if(1 == _Item) GUI_DrawStreamedBitmapAuto(_acBuffer, 110, 133);
                else if(2 == _Item) GUI_DrawStreamedBitmapAuto(_acBuffer, 215, 133);
               
                GUI_ALLOC_Free(hMem);
                return 1;
        }
        else return 0;
}
唠叨多说两句:
1.内部flash不够用,界面想漂亮一点,考虑图片数据生成dta文件存放在 flash。
2.注意刷图的时序,避开emWin最耗内存的时候去加载。(刚开始不清楚机制可能会才坑,加载一张13KB的图片不够内存加载。。)
3.如果菜单使用了三张图片,80*100,平均起来9KB*3 = 27KB,又出现内存的困境。(如参考程序,三个编号,加载一个,显示一个,自己做好标志位发消息循环。这种情况只能牺牲刷图同时性)
其他:如果图片质量要求不细腻,其实可以优化图片的色彩、无简便,做成4位彩图会小非常多。
Releasing your creativity
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-31 19:41 , Processed in 0.326046 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表