硬汉嵌入式论坛

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

[emWin] 关于图片存在外部FLASH中 显示的疑问

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2017-8-26 13:57:36 | 显示全部楼层 |阅读模式
安福来在历程中讲解  用数据流的方式读取外部的图片显示需要用到一个Get_Data函数  但是我的图片是存在外部的flash 里面  没有文件系统  安福来的教程都是基于文件系统的  读取  请问当没有文件系统的时候
Get_Data函数要怎么写呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-8-26 14:10:44 | 显示全部楼层
就是下面这个函数,照葫芦画瓢修改就行。其中第一个参数这里不用文件系统了,你可以用来传递流位图在flash中的位置。其它的f_lseek和f_read统一采用你的flash读函数实现即可。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: _GetData
  4. *    功能说明: 被函数GUI_BMP_DrawEx调用
  5. *    形    参:p             FIL类型数据
  6. *             NumBytesReq   请求读取的字节数
  7. *             ppData        数据指针
  8. *             Off           如果Off = 1,那么将重新从起始位置读取                 
  9. *    返 回 值: 返回读取的字节数
  10. *********************************************************************************************************
  11. */
  12. int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
  13. {
  14.     static int FileAddress = 0;
  15.     UINT NumBytesRead;
  16.     FIL *PicFile;
  17.     PicFile = (FIL *)p;
  18.     /*
  19.     * 检测缓存大小
  20.     */
  21.     if (NumBytesReq > sizeof(acBuffer)) {
  22.     NumBytesReq = sizeof(acBuffer);
  23.     }
  24.     /*
  25.     * 设置读取位置
  26.     */
  27.     if(Off == 1) FileAddress = 0;
  28.     else FileAddress = Off;
  29.     result =f_lseek(PicFile, FileAddress);
  30.     /*
  31.     * 读取数据到缓存
  32.     */
  33.     result = f_read(PicFile, acBuffer, NumBytesReq, &NumBytesRead);
  34.     /*
  35.     * 让指针ppData指向读取的数据
  36.     */
  37.     *ppData = (const U8 *)acBuffer;
  38.     /*
  39.     * 返回读取的字节数
  40.     */
  41.     return NumBytesRead;
  42. }
复制代码
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-8-26 14:18:05 | 显示全部楼层
能不能写一个实例啊,实在是不会弄了好长时间 都显示不了,实在是逼不得已才来发帖询问
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-8-26 14:24:01 | 显示全部楼层

回 1359450511 的帖子

1359450511:能不能写一个实例啊,实在是不会弄了好长时间 都显示不了,实在是逼不得已才来发帖询问 (2017-08-26 14:18) 
不好意思啊,我们没有实例,只是以前给过其他群友一个提示,这种方法是可以的。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2017-8-26 15:50:41 | 显示全部楼层
他们实现了么?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-8-28 01:59:10 | 显示全部楼层

回 1359450511 的帖子

1359450511:他们实现了么?
 (2017-08-26 15:50) 
实现了,没问题。
回复

使用道具 举报

22

主题

128

回帖

194

积分

初级会员

积分
194
发表于 2017-8-29 14:40:38 | 显示全部楼层

回 1359450511 的帖子

1359450511:他们实现了么?
 (2017-08-26 15:50) 
实现了么,分享一下。没文件系统时
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-8-29 14:54:29 | 显示全部楼层

回 kirito 的帖子

kirito:实现了么,分享一下。没文件系统时 (2017-08-29 14:40) 
网友做的,不是我做的。

等我有精力了,做一个分享给你。
回复

使用道具 举报

22

主题

128

回帖

194

积分

初级会员

积分
194
发表于 2017-8-29 16:46:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:网友做的,不是我做的。

等我有精力了,做一个分享给你。 (2017-08-29 14:54) 
[s:143]
回复

使用道具 举报

22

主题

128

回帖

194

积分

初级会员

积分
194
发表于 2017-9-4 19:01:14 | 显示全部楼层

回 eric2013 的帖子

eric2013:

实现了,没问题。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: _GetData
  4. *    功能说明: 被函数GUI_BMP_DrawEx调用
  5. *    形    参:p             U32指针类型数据
  6. *             NumBytesReq   请求读取的字节数
  7. *             ppData        数据指针
  8. *             Off           如果Off = 1,那么将重新从起始位置读取               
  9. *    返 回 值: 返回读取的字节数
  10. *********************************************************************************************************
  11. */
  12. int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
  13. {
  14.     static int FileAddress = 0;
  15.     U32 NumBytesRead;
  16.     U32 phFile;
  17.     phFile =*(U32*)p;
  18.     /*
  19.     * 检测缓存大小
  20.     */
  21.     if (NumBytesReq > sizeof(DispalyBuff)) {
  22.     NumBytesReq = sizeof(DispalyBuff);
  23.     }
  24.     /*
  25.     * 设置读取位置
  26.     */
  27.     if(Off == 1) FileAddress = phFile;
  28.     else FileAddress = phFile + Off;   
  29.     /*
  30.     * 读取数据到缓存
  31.     */
  32.     w25_ReadBuffer(DispalyBuff,FileAddress,NumBytesReq);
  33.     /*
  34.     * 让指针ppData指向读取的数据
  35.     */
  36.     *ppData = (const U8 *)DispalyBuff;
  37.     /*
  38.     * 返回读取的字节数
  39.     */
  40.     return NumBytesRead;
  41. }
  42. /*
  43. *********************************************************************************************************
  44. *    函 数 名: _ShowGIF1
  45. *    功能说明: 显示GIF片
  46. *    形    参: sFilename 要显示的图片名字
  47. *    返 回 值: 无
  48. *********************************************************************************************************
  49. */
  50. GUI_GIF_INFO InfoGif = {0}; /* Info structure of GIF file */
  51. GUI_GIF_IMAGE_INFO ImagInfoGif = {0}; /* Info structure of one particular GIF image of the GIF file */
  52. void _ShowGIF1(int FileAddress)
  53. {
  54.     uint16_t i = 0;
  55.     uint32_t t0, t1,FileAddressTmp;
  56.     char buf[50];
  57.     FileAddressTmp=FileAddress;
  58.     /* 获取GIF图片信息 */
  59.     GUI_GIF_GetInfoEx(_GetData, &FileAddressTmp,&InfoGif);
  60.     while(1)
  61.     {
  62.          /* 变量用来设置当前播放的帧数,InfoGif.NumImages是GIF图片总的帧数 */
  63.          if(i < InfoGif.NumImages)
  64.          {
  65.               /* 获取当前帧GIF图片信息,注意第4个参数是从0开始计数的 */
  66.               GUI_GIF_GetImageInfoEx(_GetData, &FileAddressTmp, &ImagInfoGif, i);
  67.             
  68.               /* 如果此帧延迟时间是0,默认是延迟100ms */
  69.               if(ImagInfoGif.Delay == 0)
  70.               {
  71.                    GUI_Delay(100);
  72.               }
  73.               else
  74.               {
  75.                    t0 = GUI_GetTime();
  76.                    /* 显示当前播放的帧数 */
  77.                    sprintf(buf, "     Frame:%d/%d     ", i+1, InfoGif.NumImages);
  78.                    GUI_DispStringHCenterAt(buf, LCD_GetXSize()/2, 0);
  79.                   
  80.                    /* 解码并显示此帧GIF图片,注意第5个参数是从0开始计数的 */
  81.                    GUI_GIF_DrawSubEx(_GetData,
  82.                                        &FileAddressTmp,
  83.                                        (LCD_GetXSize() - InfoGif.xSize)/2,
  84.                                        (LCD_GetYSize() - InfoGif.ySize)/2,
  85.                                        i++);
  86.                   
  87.                    /* 获取本次解码和显示消耗的时间 */
  88.                    t1 = GUI_GetTime() - t0;
  89.                   
  90.                    /* 如果GIF的解码和显示的时间超时就不做延迟 */
  91.                    if (t1 < ImagInfoGif.Delay * 10)
  92.                    {
  93.                        GUI_Delay(ImagInfoGif.Delay * 10 - t1);
  94.                    }
  95.               }              
  96.         }
  97.         else
  98.         {
  99.             i = 0;
  100.         }
  101.     }
  102. }
复制代码
调用了GUI_GIF_GetInfoEx,但打印出来并没有调用_GetData函数,这是什么原因?另外ucgui 3.98 好像没有Ex结尾的接口
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-9-5 00:42:42 | 显示全部楼层

回 kirito 的帖子

kirito:/*
*********************************************************************************************************
*    函 数 名: _GetData
*    功能说明: 被函数GUI_BMP_DrawEx调用
....... (2017-09-04 19:01) 
换一个BMP的测试测试。
回复

使用道具 举报

22

主题

128

回帖

194

积分

初级会员

积分
194
发表于 2017-9-5 11:37:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:换一个BMP的测试测试。 (2017-09-05 00:42)
上面函数_GetData返回前加一句NumBytesRead=NumBytesReq。调用GUI_BMP_DrawEx显示正常,但调用GUI_GIF_GetInfoEx,打印出来并没有调用_GetData函数?
另外调用GUI_BMP_DrawEx时,明明我数组开得很大(86400),但他每次调用_GetData传进来的NumBytesReq却比较小(720),这个NumBytesReq怎么能用他大一点?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-9-6 00:51:58 | 显示全部楼层

回 kirito 的帖子

kirito:上面函数_GetData返回前加一句NumBytesRead=NumBytesReq。调用GUI_BMP_DrawEx显示正常,但调用GUI_GIF_GetInfoEx,打印出来并没有调用_GetData函数?
另外调用GUI_BMP_DrawEx时,明明我数组开得很大(86400),但他每次调用_GetData传进来的NumBytesReq却比较小(720),这个NumB .. (2017-09-05 11:37) 
这个是他内部程序结构决定,貌似不能改了,你换种字体就修改了。如果你用的XBF格式字体,可以看官方最近的5.42版本给出的格式:http://www.armbbs.cn/forum.php?mod=viewthread&tid=35669
回复

使用道具 举报

22

主题

128

回帖

194

积分

初级会员

积分
194
发表于 2017-9-6 09:13:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个是他内部程序结构决定,貌似不能改了,你换种字体就修改了。如果你用的XBF格式字体,可以看官方最近的5.42版本给出的格式:http://www.armbbs.cn/forum.php?mod=viewthread&tid=35669 (2017-09-06 00:51) 
调用GUI_BMP_DrawEx正常显示是不是代表_GetData对了?不知道为什么没法显示GIF,甚至它根本都没调用GetData
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2017-9-7 00:36:34 | 显示全部楼层

回 kirito 的帖子

kirito:调用GUI_BMP_DrawEx正常显示是不是代表_GetData对了?不知道为什么没法显示GIF,甚至它根本都没调用GetData (2017-09-06 09:13)
多试试,估计是那里使用错误。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-3-30 16:11:46 | 显示全部楼层
eric2013 发表于 2017-9-7 00:36
多试试,估计是那里使用错误。

硬汉兄,有几个问题请教下:
   公司项目之前用12864作为屏幕,接口为模拟SPI,现在需要改成彩屏,待机时需要轮询几张静态图片显示,考虑到模拟SPI速度,想要选用贵司7寸液晶带图库芯片,有几个疑问:
1)图库芯片和RA8875是否同一个SPI可驱动,图库芯片是通过RA8875控制的?
2)图库芯片能否在线更新图片数据,能存几张?
3)每张图片刷新速度如何?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-3-30 18:04:06 | 显示全部楼层
漠海 发表于 2018-3-30 16:11
硬汉兄,有几个问题请教下:
   公司项目之前用12864作为屏幕,接口为模拟SPI,现在需要改成彩屏,待机 ...

1. 图库芯片通过RA8875控制的。
2. 可以,是通过V5的出厂程序搞的。
3. RA8875刷,好像是100ms左右一张800*480图片。

详情最好问下旺旺,因为我自己基本没用过这个功能。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2018-4-3 09:07:40 | 显示全部楼层
eric2013 发表于 2018-3-30 18:04
1. 图库芯片通过RA8875控制的。
2. 可以,是通过V5的出厂程序搞的。
3. RA8875刷,好像是100ms左右一张 ...

还有一个问题请教下,如果用emwin 做界面,RAM必须要满足缓存整个LCD像素吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-4-3 10:40:10 | 显示全部楼层
漠海 发表于 2018-4-3 09:07
还有一个问题请教下,如果用emwin 做界面,RAM必须要满足缓存整个LCD像素吗?

这个不需要用户去管,RA8875自带显存。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 11:38 , Processed in 0.504548 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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