好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第12章emWin(UCGUI)JPEG图片显示.pdf

9页
  • 卖家[上传人]:ldj****22
  • 文档编号:35989147
  • 上传时间:2018-03-23
  • 文档格式:PDF
  • 文档大小:464.23KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 安安富富莱莱S ST TM M3 32 2- -V V5 5开开发发板板S ST Te em mW Wi in n教教程程第第 1 1 页页 共共 9 9 页页 第12章 JPEG 图片显示 本期主要讲 emWin 支持的 JPEG 图片的显示,官方支持的主要有两种显示方法,一种是从外部存储器读取数据到内部存储器后,再显示图片,这种的显示速度要快些另一种方法是直接从外部存储器读取数据并显示,这种办法的好处就是不要大的 RAM 需求,每次读取一些数据显示一次,坏处就是显示速度比较的慢 由于官方提供的 JPEG 的显示方法比较耗 RAM, 这里将 2MB 的外部 SRAM 做为 emWin 的动态内存 12. 1 JPEG 图片支持 12. 2 绘制已经加载到存储器的 JPEG 图片 12. 3 绘制无须加载到存储器的 JPEG 图片 12. 4 实验总结 12.1 J JP PE EGG 图图片片支支持持 JPEG(读音为 “jay-peg” )是全彩和灰度图像的标准压缩方法JPEG 用于压缩 “真实世界”的景象、线条画、卡通,其他非现实图像并不是其强项。

      JPEG 会有损耗,意指输出图像与输入图像并不完全相同因此,如果您必须达到完全相同的输出位,则不能使用 JPEG不过,对于常见的照片图像,可以得到非常好的压缩级别,看不出变化并且如果您能容忍低质量的图像,则可以实现相当高的压缩级别 这里有一点要特别的注意:出于法律原因,不得分发 JPEG 算术编码变体的代码JPEG 规范的算术编码选项似乎属于归 IBM、AT GUI_JPEG_Draw(_ac11, sizeof(_ac11), 0, 0); while(1) { GUI_Delay(100); } } 实际显示效果如下: 安安富富莱莱S ST TM M3 32 2- -V V5 5开开发发板板S ST Te em mW Wi in n教教程程第第 3 3 页页 共共 9 9 页页 12.1.2 JPEG 存储器方式显示 为了区分上面将图片转换为 C 文件进行显示, 这里将 JPEG 图片存入到外部 SD 卡等存储器中进行加载显示 首先要注意 JPEG 需要的动态内存大小,一般图片显示不出来往往是因为动态内存不够造成的JPEG解压缩大约需要 33 Kb RAM 用于与图像大小无关的解压缩和依赖大小的字节量。

      RAM 要求可按以下方式计算: App.大约 RAM 要求=图像的 X 大小* 80 字节+ 33 千字节 依赖于 X 大小的量取决于 JPEG 文件的压缩类型下表显示了部分示例: 解压缩所需的存储器由 emWin 存储器管理系统动态分配绘制 JPEG 图像后,将释放整个 RAM为了形象说明,下面举一个例子:比如要显示 800*480 的 jpeg 大约需要 800*80 + 33k = 97k 的内存,鉴于这种情况,这里把外部的 2MB 的 SRAM 做为动态内存, 使用前记得初始化 SRAM,然后就是在 GUIconf.c文件里面初始化一下 STemWin 支持的 JPEG 函数如下: 安安富富莱莱S ST TM M3 32 2- -V V5 5开开发发板板S ST Te em mW Wi in n教教程程第第 4 4 页页 共共 9 9 页页 12.2 绘绘制制已已经经加加载载到到存存储储器器的的 J JP PE EGG 图图片片 将图片加载到存储器后进行显示比较的耗内存,所以这里就使用开发板外置的 2MB SRAM 做STemWin 的动态内存空间,并通过相应的 API 函数申请动态内存来加载 SD 卡等外部存储器中的 JPEG 图片。

      申请和释放 STemWin 动态内存的方法如下: /* 申请一块内存空间 并且将其清零 */ hMem = GUI_ALLOC_AllocZero(100000); /* 将申请到内存的句柄转换成指针类型 */ _acBuffer2 = GUI_ALLOC_h2p(hMem); /* 释放申请的动态内存 */ GUI_ALLOC_Free(hMem); 比如我们要显示下面的 JPEG 格式的图片(800*480 分辨率) : 就可以把这个图片放到 SD 卡中,然后通过程序把这个图片数据全部的加载到 SRAM 中,最后在屏上进行显示这个工程的实现主要分为如下三个部分:  SRAM 和 SD 卡及其文件系统的初始化  图片的加载以及显示函数  主函数 下面把这三部分详细的讲解下:  SRAM 和 SD 卡及其文件系统的初始化,这部分函数与上面第 11 章的 11.2 小节一样  图片的加载以及显示函数 安安富富莱莱S ST TM M3 32 2- -V V5 5开开发发板板S ST Te em mW Wi in n教教程程第第 5 5 页页 共共 9 9 页页 /* ********************************************************************************************************* * 函 数 名: _ShowJPG * 功能说明: 显示 JPEG 图片 * 形 参:sFilename 要显示的图片名字 * 返 回 值: 无 ********************************************************************************************************* */ static void _ShowJPG(const char * sFilename) { GUI_HMEM hMem; char *_acBuffer2; /* 申请一块内存空间 并且将其清零 */ (1)(1) hMem = GUI_ALLOC_AllocZero(1024*512); /* 将申请到内存的句柄转换成指针类型 */ _acBuffer2 = GUI_ALLOC_h2p(hMem); /* 打开文件 */ result = f_open( if (result != FR_OK) { return; } result = f_read( if (result != FR_OK) { return; } GUI_JPEG_GetInfo(_acBuffer2, file.fsize, (2)(2) GUI_JPEG_Draw(_acBuffer2, (3)(3) file.fsize, 0, 0); GUI_ALLOC_Free(hMem); f_close( } 1. 申请一块动态内存,并将 JPEG 数据加载到动态内存中。

      2. 利用已加载到存储器的 jpeg 文件的相关信息填充 GUI_JPEG_INFO 结构 3. 将 JPEG 图片显示到屏上  主函数 /* ********************************************************************************************************* * 函 数 名: MainTask * 功能说明: GUI 主函数 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void MainTask(void) { GUI_Init(); 安安富富莱莱S ST TM M3 32 2- -V V5 5开开发发板板S ST Te em mW Wi in n教教程程第第 6 6 页页 共共 9 9 页页 /* 设置皮肤函数 */ PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX); FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX); PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX); BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX); CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX); DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX); SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX); SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX); HEADER_SetDefaultSkin(HEADER_SKIN_FLEX); RADIO_SetDefaultSkin(RADIO_SKIN_FLEX); while(1) { _ShowJPG(“2.jpg“); } } 实际显示效果如下: 12.3 绘绘制制无无需需加加载载到到存存储储器器的的 J JP PE EGG 图图片片 绘制无需加载到存储器的 JPEG 图片方式可以有效的解决内部动态内存不够的情况,不过缺点也很明显,图片的显示速度很慢。

      这种方式一般是每次读取一行像素的数据,然后进行显示这个工程的实现主要分为如下三个部分:  使用芯片内部的 SRAM 作为动态内存  图片的加载以及显示函数  主函数 下面把这三部分详细的讲解下:  使用芯片外部的 SRAM 作为动态内存,这部分函数与上面第 11 章的 11.2 小节一样,由于 jpeg 比较安安富富莱莱S ST TM M3 32 2- -V V5 5开开发发板板S ST Te em mW Wi in n教教程程第第 7 7 页页 共共 9 9 页页 的消耗内存,这里和 BMP 不同也需要使用动态内存  图片的加以及显示函数 static char _acBuffer[0x2000]; GUI_JPEG_INFO JpegInfo; /* ********************************************************************************************************* * * _GetData * * Purpose: * This routine is called by GUI_JPEG_DrawEx(). The routine is responsible * for setting the data pointer to a valid data location with at least * one valid byte. * * Parameters: * p - Pointer to application defined data. * NumBytesReq - Number of bytes requested. * ppData - Pointer to data pointer. This pointer should be set to * a valid location. * StartOfFile - If this flag is 1, the data pointer should be set to th。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.