硬汉嵌入式论坛

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

[emWin] 如果想要显示多个全屏图片,图片太大只能放在SPI flash,应该如何操作呢?

[复制链接]

22

主题

114

回帖

180

积分

初级会员

积分
180
发表于 2020-9-18 15:38:04 | 显示全部楼层 |阅读模式
有没有具体的例程参考一下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-9-18 16:24:02 | 显示全部楼层
现成的例子没有。

间接的有,此贴XBF,SIF全字库章节配套例子,都是用的SPI Flash,使用图片是一样的。
【安富莱】全新65章2076页史诗级emWin教程发布,5年的实战经验全奉献,本次教程突出实战
https://forum.anfulai.cn/forum.p ... 9834&fromuid=58
(出处: 硬汉嵌入式论坛)




回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-9-18 16:26:01 | 显示全部楼层
eric2013 发表于 2020-9-18 16:24
现成的例子没有。

间接的有,此贴XBF,SIF全字库章节配套例子,都是用的SPI Flash,使用图片是一样的。
...

好的,谢谢硬汉哥
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-9-18 16:35:34 | 显示全部楼层
eric2013 发表于 2020-9-18 16:24
现成的例子没有。

间接的有,此贴XBF,SIF全字库章节配套例子,都是用的SPI Flash,使用图片是一样的。
...


static void _ShowStreamBitmap(const char *sFilename, int x, int y)
{
        char *_acBuffer;
        GUI_HMEM hMem;
        FRESULT result;
       
#if !defined Method1
        GUI_BITMAP Bitmap;
        GUI_LOGPALETTE Palette;     
#endif
       
        /* 打开文件 */               
        result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
        if (result != FR_OK)
        {
                return;
        }
       
        /* 申请一块内存空间 并且将其清零 */
    hMem = GUI_ALLOC_AllocZero(file.fsize);
        /* 将申请到内存的句柄转换成指针类型 */
        _acBuffer = GUI_ALLOC_h2p(hMem);

     /* 读取文件到动态内存 */
     result = f_read(&file, _acBuffer, file.fsize, &bw);
     if (result != FR_OK)
     {
         return;
     }
         /*启用对所有流位图格式的支持*/
         WIDGET_EnableStreamAuto();
         
         /* 关闭文件 */
         f_close(&file);
         
        /* 显示方法一 */
#if defined Method1
        GUI_DrawStreamedBitmapAuto(_acBuffer, x, y);
       
        /* 显示方法二 */
#elif defined Method2       
    GUI_CreateBitmapFromStream(&Bitmap, &Palette, _acBuffer);
        GUI_DrawBitmap(&Bitmap, x, y);
       
        /* 显示方法三 仅支持RGB565格式的图片显示 */
#elif defined Method3       
        GUI_CreateBitmapFromStream565(&Bitmap, &Palette, _acBuffer);
        GUI_DrawBitmap(&Bitmap, x, y);
#endif

    /* 释放动态内存,这里有两点注意事项:
         1. 如果这个流位图是一直要使用的,动态内存是不可以释放的。
         2. 如果使用的是方法2或者方法3进行显示,且此流位图是要一直使用,变量
            GUI_BITMAP Bitmap和GUI_LOGPALETTE Palette不可以定义成局部变量,因为
            退出函数后,局部变量就被释放给栈空间了。
         */     
//        GUI_ALLOC_Free(hMem);
}
然后我在WM_PAINT里调用函数_ShowStreamBitmap("UI11.dta", 0, 0);显示图片就变成白屏了这是怎么回事?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-9-18 16:47:02 | 显示全部楼层
zxc19970106 发表于 2020-9-18 16:35
static void _ShowStreamBitmap(const char *sFilename, int x, int y)
{
        char *_acBuffer;

不可以直接把这个放在WM_PAITNT里面,这个是完全错误的办法!
你这个光申请不释放了,进几次就没有内存了。


回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-9-18 17:06:39 | 显示全部楼层
eric2013 发表于 2020-9-18 16:47
不可以直接把这个放在WM_PAITNT里面,这个是完全错误的办法!
你这个光申请不释放了,进几次就没有内存 ...

可是我这个是多个页面使用不同的背景图片,那要放哪里?界面切换不是一直都要用到流位图吗,释放掉动态内存不是不能显示图片了吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-9-18 17:18:41 | 显示全部楼层
zxc19970106 发表于 2020-9-18 17:06
可是我这个是多个页面使用不同的背景图片,那要放哪里?界面切换不是一直都要用到流位图吗,释放掉动态内 ...

单独开个函数做此处理,记住一点你在WM_PAINT调用,要做到直接就可以调用。
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-9-19 10:43:04 | 显示全部楼层
eric2013 发表于 2020-9-18 17:18
单独开个函数做此处理,记住一点你在WM_PAINT调用,要做到直接就可以调用。

硬汉哥,我的图片比较大而且是全屏显示的,一张差不多1M,可以使用您那种绘制到内存设备的方法吗?
回复

使用道具 举报

7

主题

85

回帖

111

积分

初级会员

积分
111
发表于 2020-9-23 16:41:40 | 显示全部楼层
zxc19970106 发表于 2020-9-19 10:43
硬汉哥,我的图片比较大而且是全屏显示的,一张差不多1M,可以使用您那种绘制到内存设备的方法吗?

只要SDRAM分给emwin的动态内存足够,开辟一个内存设备来储存这个背景图,然后在WM_PAINT里刷即可
回复

使用道具 举报

22

主题

114

回帖

180

积分

初级会员

积分
180
 楼主| 发表于 2020-9-24 10:14:10 | 显示全部楼层
JIKIMO 发表于 2020-9-23 16:41
只要SDRAM分给emwin的动态内存足够,开辟一个内存设备来储存这个背景图,然后在WM_PAINT里刷即可

这样搞那不是要将图片转换为.c文件,可是我这两张全屏图片转换后是10M大小,这样不是会导致内存不够卡死?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-17 12:34 , Processed in 0.045182 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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