硬汉嵌入式论坛

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

[emWin] emWin图片

[复制链接]

9

主题

9

回帖

36

积分

新手上路

积分
36
发表于 2023-7-11 15:00:31 | 显示全部楼层 |阅读模式
想问下实际项目中,emWin需要很多背景图片,图片背景不是透明的,图片放在SD卡中,从显示速度和占用内存空间来看,png和jpg,是优先选择jpg吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106904
QQ
发表于 2023-7-11 16:14:56 | 显示全部楼层
如果是背景图,优先选择dat位图格式。
回复

使用道具 举报

9

主题

9

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2023-7-11 21:08:10 | 显示全部楼层
那dat位图放在SD卡,不放在flash,可以实现较快的刷新吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106904
QQ
发表于 2023-7-12 08:30:22 | 显示全部楼层
菜鸡哥 发表于 2023-7-11 21:08
那dat位图放在SD卡,不放在flash,可以实现较快的刷新吗

是的,dat是流位图方式,已经解码好了,仅需直接绘制即可。

而png,jpeg都需要解码后才可以绘制,时间比较长。
回复

使用道具 举报

9

主题

9

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2023-7-12 09:55:29 | 显示全部楼层
我把dta流位图放在SD卡里,感觉显示不是特别快
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106904
QQ
发表于 2023-7-12 14:11:53 | 显示全部楼层
菜鸡哥 发表于 2023-7-12 09:55
我把dta流位图放在SD卡里,感觉显示不是特别快

emWin动态内存大的话,可以先绘制到存储设备里面,然后调用存储设备的API刷新,速度非常快。
回复

使用道具 举报

9

主题

9

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2023-7-13 16:07:54 | 显示全部楼层
硬汉哥,我把流位图放在sd卡里,配上内存设备,发现一个问题,就是用GUI_DrawStreamedBitmapAuto(_acBuffer1, x0, y0)加上内存设备,图片就不显示,而不用内存设备只用GUI_DrawStreamedBitmapAuto图片就显示,我把代码贴出来,您帮我看一下

GUI_HMEM ShowStreamedBitmap2(const char *sFilename, int x0, int y0)
{
          char *_acBuffer1= NULL;
          GUI_HMEM hMem;
                int XSize, YSize;          
          GUI_MEMDEV_Handle hBMP;
                /* 进入临界段 */
    taskENTER_CRITICAL();
    /* 打开图片 */
    result = f_open(&file, sFilename, FA_READ);
    if ((result != FR_OK)) {
        printf("文件打开失败!\r\n");
        _acBuffer1[0]='\0';
    }
        /* 申请一块动态内存空间 */
    hMem = GUI_ALLOC_AllocZero(file.fsize);
    /* 转换动态内存的句柄为指针 */
    _acBuffer1 = GUI_ALLOC_h2p(hMem);

    /* 读取图片数据到动态内存中 */
    result = f_read(&file, _acBuffer1, file.fsize, &f_num2);
    if (result != FR_OK) {
        printf("文件读取失败!\r\n");
    }
    /* 读取完毕关闭文件 */
    f_close(&file);
    /* 退出临界段 */
    taskEXIT_CRITICAL();
                XSize = GUI_BMP_GetXSize(_acBuffer1);
                YSize = GUI_BMP_GetYSize(_acBuffer1);
                /* 创建内存设备,并将 BMP 图片绘制到此内存设备里面,此内存设备要在主程序中用到
                 所以退出此函数前,不要释放。
                */
                hBMP = GUI_MEMDEV_CreateEx(x0, y0, XSize, YSize, GUI_MEMDEV_HASTRANS);
                GUI_MEMDEV_Select(hBMP);
                GUI_DrawStreamedBitmapAuto(_acBuffer1, x0, y0);               
                GUI_MEMDEV_Select(0);
                /* 释放动态内存 hMem */
        //        GUI_ALLOC_Free(hMem);       
                return hBMP;
}

//窗口回调
case WM_INIT_DIALOG:
                        //创建内存设备
                        hMemBMP=ShowStreamedBitmap2("0:/DTA/menu.dta",0,0);
               
                        /* 设置为模态窗口 */
                        WM_MakeModal(hWin);                       
                break;
       
         case WM_PAINT:                 
                        GUI_SetBkColor(GUI_WHITE);
                        GUI_Clear();
                        GUI_MEMDEV_CopyToLCDAt(hMemBMP,0,0);
                 break;
回复

使用道具 举报

7

主题

23

回帖

44

积分

新手上路

积分
44
发表于 2023-7-13 17:27:50 | 显示全部楼层
bmp图片会快一点吗?
回复

使用道具 举报

9

主题

9

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2023-7-13 19:33:25 | 显示全部楼层
a2412462142 发表于 2023-7-13 17:27
bmp图片会快一点吗?

我把bmp图片和png都放在sd卡里,没有使用内存设备,bmp显示的快一点,png多了一个解码的过程
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 11:11 , Processed in 0.231576 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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