OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3618|回复: 4

图片数据放到外部flash,并通过emwin显示

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2018-7-20
在线时间
17 小时
发表于 2019-3-14 14:19:39 | 显示全部楼层 |阅读模式
10金钱
各位大大请问一个问题:
        我把有透明度的PNG图片用BmpCvt.exe另存为True color with alpha格式的C文件放在内部flash中程序调用GUI_DrawBitmap函数可以正常显示透明度,图片能完美显示。现在因为图片太多,全部放在内部flash不现实,而且不方便后续图片的更新,所以把图片数据通过文件系统全部保存到外部flash中,那么问题来了!!!
      1、直接将bmp或者ipg的图片烧写到外部flash,通过GUI_DraWBitmap等函数显示时不能正确的显示透明度。
      2、基于bmp,jpg不能显示透明度,那么将图片统一改成PNG格式,后面通过移植png库,将png的图片显示出来,但是png的渲染不够,导致了png图片在一些特定的场合,透明度不完全透明,显示不够完美。

     基于以上几点,我想到的方式是将png的图片先用BmpCvt.exe生成True color with alpha格式的数据,然后将这些数据放到外部flash,但是这个方式有个问题就是我的程序怎么去索引到这个一段数据的地址?,并将其显示?

    目前还没想到好的方法,请路过的大佬指点,指点,非常感谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-3-16 02:39:44 | 显示全部楼层
回复

使用道具 举报

9

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2019-1-3
在线时间
34 小时
发表于 2019-3-17 21:43:54 | 显示全部楼层
帮顶  
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2018-7-20
在线时间
17 小时
 楼主| 发表于 2019-3-19 16:42:01 | 显示全部楼层
这个问题已经完美解决
解决的步骤:
         1、使用BmpCvt.exe将带有透明度的png或者bmp保存成.dta文件
         2、通过文件系统烧写到外部flash中
         3、调用流文件接口函数显示图片
流文件接口函数,我自己写了一个,代码如下:
void LCD_ShowBmpDta(const char *sFilename, uint16 x, uint16 y)
{
        char *_acBuffer;
        GUI_HMEM hMem;

        // 打开文件
        result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
        if(FR_OK != result)
        {
        printf("LCD_ShowBMP 打开失败,错误类型:%d",result);         
                return;
        }

        // 申请一块内存空间 并且将其清零
        hMem = GUI_ALLOC_AllocZero(file.obj.objsize);
       
        // 将申请到内存的句柄转换成指针类型
        _acBuffer = GUI_ALLOC_h2p(hMem);

        // 读取文件到动态内存
        f_read(&file, _acBuffer, file.obj.objsize, &bw);
        if(FR_OK != result)
        {
        printf("LCD_ShowBMP 读取文件到动态内存失败,错误类型:%d",result);        
                return;
        }
       
        // 启用对所有流位图格式的支持
           WIDGET_EnableStreamAuto();

           // 流文件显示
        GUI_DrawStreamedBitmapAuto(_acBuffer,x,y);

        // 释放动态内存hMem
        GUI_ALLOC_Free(hMem);
       
        // 关闭文件
        f_close(&file);
}
回复

使用道具 举报

18

主题

148

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1528
金钱
1528
注册时间
2018-11-15
在线时间
292 小时
发表于 2019-7-2 10:43:47 | 显示全部楼层
xiaoshuli 发表于 2019-3-19 16:42
这个问题已经完美解决
解决的步骤:
         1、使用BmpCvt.exe将带有透明度的png或者bmp保存成.dta文件 ...

求支持,我也是遇到类似问题,从SD卡读取dta文件显示到按钮上面去(内存不够),你这样成功了吗!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 05:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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