` 本帖最后由 硬汉Eric2013 于 2015-3-28 15:36 编辑
第12章 JEPG图片显示
本期主要讲emWin支持的JPEG图片的显示,官方支持的主要有两种显示方法,一种是从外部存储器读取数据到内部存储器后,再显示图片,这种的显示速度要快些。另一种方法是直接从外部存储器读取数据并显示,这种办法的好处就是不要大的RAM需求,每次读取一些数据显示一次,坏处就是显示速度比较的慢。 由于官方提供的JPEG的显示方法比较耗RAM,这里将2MB的外部SRAM做为emWin的动态内存。 12. 1 JPEG图片支持 12. 2 绘制已经加载到存储器的JPEG图片 12. 3 绘制无须加载到存储器的JPEG图片 12. 4 实验总结
12.1 JPEG图片支持 JPEG(读音为 “jay-peg”)是全彩和灰度图像的标准压缩方法。JPEG用于压缩 “真实世界”的景象、线条画、卡通,其他非现实图像并不是其强项。JPEG会有损耗,意指输出图像与输入图像并不完全相同。因此,如果您必须达到完全相同的输出位,则不能使用JPEG。不过,对于常见的照片图像,可以得到非常好的压缩级别,看不出变化。并且如果您能容忍低质量的图像,则可以实现相当高的压缩级别。 这里有一点要特别的注意:出于法律原因,不得分发JPEG算术编码变体的代码。JPEG规范的算术编码选项似乎属于归IBM、AT&T和Mitsubishi所有的专利。因此,从法律上讲,如未获得一个或多个许可,则不能使用算术编码。因此,尚未包含对算术编码的支持。(由于算术编码相对于未获专利的Huffman模式仅具有限界收益,因此不太可能有太多实施支持它。)JPEG文件支持不包含提供标准中定义的层次式或无损流程。 12.1.1 JPEG格式图标转换 某些情况下,将JPEG文件作为C文件添加到项目中非常有用。这时,首先需要将JPEG文件转换为C文件。使用emWin随附的工具Bin2C.exe可完成此任务。这个Bin2C.exe工具在STemWin软件包里面没有,需要到MDK安装目录里面找。下面我们下图JPEG格式的图片转换成C文件。
l 打开软件加载上面的图片
l 加载后点击Convert即可,点击后没有任何现象,直接去图片所在的文件夹找即可
实际运行代码如下(图片数据就不贴出来了,看本期教程配套的例子)
- void MainTask(void)
- {
- GUI_Init();
- GUI_JPEG_Draw(_ac11, sizeof(_ac11), 0, 0);
- while(1)
- {
- GUI_Delay(100);
- }
- }
复制代码
实际显示效果如下:
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函数如下: |