EMWIN

文章目录

  • EMWIN
  • 前言
  • 一、JPEG 文件 API 函数
  • 二、实验演示

前言

JPEG 是全彩和灰度图像的标准压缩方法, JPEG 用于压缩“真实世界”的景象、线条画、卡通,其他非现实图像并不是其强项。 JPEG 会有损耗,意指输出图像与输入图像并不完全相同,因此,如果需要达到完全相同的输出位,则不能使用 JPEG。不过,对于常见的照片图像,可以得到非常好的压缩级别,看不出变化。emWin 支持 JPEG 图片显示,可以直接从外部存储器(如 SD 卡)中读取 JPEG 图片文件在 LCD 上显示。

一、JPEG 文件 API 函数

GUI_JPEG_Draw() 绘制已加载到存储器的 JPEG 文件。
GUI_JPEG_DrawEx() 绘制无需加载到存储器的 JPEG 文件。
GUI_JPEG_DrawScaled() 绘制已加载到存储器的带比例的 JPEG 文件。
GUI_JPEG_DrawScaledEx() 绘制无需加载到存储器的带比例的 JPEG 文件。
GUI_JPEG_GetInfo() 基于已加载到存储器的 JPEG 文件填充 UGI_JPEG_INFO 结构。
GUI_JPEG_GetInfoEx() 基于无需加载到存储器的 JPEG 文件填充 GUI_JPEG_INFO 结构。

二、实验演示

#include "jpegdisplay.h"
#include "EmWinHZFont.h"
#include "GUI.h"
#include "malloc.h"
#include "ff.h"
#include "lcd.h"#if SYSTEM_SUPPORT_UCOS
#include "includes.h"                 //ucos ʹÓÃ
#endifstatic FIL JPEGFile;
static char jpegBuffer[JPEGPERLINESIZE];static int JpegGetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{static int readaddress=0;FIL * phFile;UINT NumBytesRead;#if SYSTEM_SUPPORT_UCOSOS_CPU_SR cpu_sr;#endifphFile = (FIL *)p;if (NumBytesReq > sizeof(jpegBuffer)) {NumBytesReq = sizeof(jpegBuffer);}//Òƶ¯Ö¸Õëµ½Ó¦¸Ã¶ÁÈ¡µÄλÖÃif(Off == 1) readaddress = 0;else readaddress=Off;#if SYSTEM_SUPPORT_UCOSOS_ENTER_CRITICAL(); //ÁÙ½çÇø#endiff_lseek(phFile,readaddress); //¶ÁÈ¡Êý¾Ýµ½»º³åÇøÖÐf_read(phFile,jpegBuffer,NumBytesReq,&NumBytesRead);#if SYSTEM_SUPPORT_UCOSOS_EXIT_CRITICAL();   //Í˳öÁÙ½çÇø#endif*ppData = (U8 *)jpegBuffer;return NumBytesRead;//·µ»Ø¶ÁÈ¡µ½µÄ×Ö½ÚÊý
}//ÔÚÖ¸¶¨Î»ÖÃÏÔʾ¼ÓÔص½RAMÖеÄJPEGͼƬ
//JPEGFileName:ͼƬÔÚSD¿¨»òÕßÆäËû´æ´¢É豸ÖеÄ·¾¶(ÐèÎļþϵͳ֧³Ö£¡)
//mode:ÏÔʾģʽ
//      0 ÔÚÖ¸¶¨Î»ÖÃÏÔʾ£¬ÓвÎÊýx,yÈ·¶¨ÏÔʾλÖÃ
//      1 ÔÚLCDÖмäÏÔʾͼƬ£¬µ±Ñ¡Ôñ´ËģʽµÄʱºò²ÎÊýx,yÎÞЧ¡£
//x:ͼƬ×óÉϽÇÔÚLCDÖеÄxÖáλÖÃ(µ±²ÎÊýmodeΪ1ʱ£¬´Ë²ÎÊýÎÞЧ)
//y:ͼƬ×óÉϽÇÔÚLCDÖеÄyÖáλÖÃ(µ±²ÎÊýmodeΪ1ʱ£¬´Ë²ÎÊýÎÞЧ)
//member:  Ëõ·Å±ÈÀýµÄ·Ö×ÓÏî
//denom:Ëõ·Å±ÈÀýµÄ·ÖĸÏî
//·µ»ØÖµ:0 ÏÔʾÕý³£,ÆäËû ʧ°Ü
int displyjpeg(u8 *JPEGFileName,u8 mode,u32 x,u32 y,int member,int denom)
{u16 bread;char *jpegbuffer;char result;int XSize,YSize;GUI_JPEG_INFO JpegInfo;float Xflag,Yflag;#if SYSTEM_SUPPORT_UCOSOS_CPU_SR cpu_sr;#endifresult = f_open(&JPEGFile,(const TCHAR*)JPEGFileName,FA_READ);  //´ò¿ªÎļþ//Îļþ´ò¿ª´íÎó»òÕßÎļþ´óÓÚJPEGMEMORYSIZEif((result != FR_OK) || (JPEGFile.fsize>JPEGMEMORYSIZE))  return 1;jpegbuffer=mymalloc(SRAMEX,JPEGFile.fsize);   //ÉêÇëÄÚ´æif(jpegbuffer == NULL) return 2;#if SYSTEM_SUPPORT_UCOSOS_ENTER_CRITICAL(); //ÁÙ½çÇø#endifresult = f_read(&JPEGFile,jpegbuffer,JPEGFile.fsize,(UINT *)&bread); //¶ÁÈ¡Êý¾Ýif(result != FR_OK) return 3;#if SYSTEM_SUPPORT_UCOSOS_EXIT_CRITICAL();  //Í˳öÁÙ½çÇø#endifGUI_JPEG_GetInfo(jpegbuffer,JPEGFile.fsize,&JpegInfo); //»ñÈ¡JEGPͼƬÐÅÏ¢XSize = JpegInfo.XSize; //»ñÈ¡JPEGͼƬµÄXÖá´óСYSize = JpegInfo.YSize; //»ñÈ¡JPEGͼƬµÄYÖá´óСswitch(mode){case 0: //ÔÚÖ¸¶¨Î»ÖÃÏÔʾͼƬif((member == 1) && (denom == 1)) //ÎÞÐèËõ·Å£¬Ö±½Ó»æÖÆ{GUI_JPEG_Draw(jpegbuffer,JPEGFile.fsize,x,y);    //ÔÚÖ¸¶¨Î»ÖÃÏÔʾJPEGͼƬ}else //·ñÔòͼƬÐèÒªËõ·Å{GUI_JPEG_DrawScaled(jpegbuffer,JPEGFile.fsize,x,y,member,denom);}break;case 1: //ÔÚLCDÖмäÏÔʾͼƬif((member == 1) && (denom == 1)) //ÎÞÐèËõ·Å£¬Ö±½Ó»æÖÆ{//ÔÚLCDÖмäÏÔʾͼƬGUI_JPEG_Draw(jpegbuffer,JPEGFile.fsize,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);}else //·ñÔòͼƬÐèÒªËõ·Å{Xflag = (float)XSize*((float)member/(float)denom);Yflag = (float)YSize*((float)member/(float)denom);XSize = (lcddev.width-(int)Xflag)/2-1;YSize = (lcddev.height-(int)Yflag)/2-1;GUI_JPEG_DrawScaled(jpegbuffer,JPEGFile.fsize,XSize,YSize,member,denom);}break;}f_close(&JPEGFile);          //¹Ø±ÕJPEGFileÎļþmyfree(SRAMEX,jpegbuffer);    //ÊÍ·ÅÄÚ´æreturn 0;
}//ÔÚÖ¸¶¨Î»ÖÃÏÔʾÎÞÐè¼ÓÔص½RAMÖеÄBMPͼƬ(ÐèÎļþϵͳ֧³Ö£¡¶ÔÓÚСRAM£¬ÍƼöʹÓô˷½·¨£¡)
//JPEGFileName:ͼƬÔÚSD¿¨»òÕßÆäËû´æ´¢É豸ÖеÄ·¾¶
//mode:ÏÔʾģʽ
//      0 ÔÚÖ¸¶¨Î»ÖÃÏÔʾ£¬ÓвÎÊýx,yÈ·¶¨ÏÔʾλÖÃ
//      1 ÔÚLCDÖмäÏÔʾͼƬ£¬µ±Ñ¡Ôñ´ËģʽµÄʱºò²ÎÊýx,yÎÞЧ¡£
//x:ͼƬ×óÉϽÇÔÚLCDÖеÄxÖáλÖÃ(µ±²ÎÊýmodeΪ1ʱ£¬´Ë²ÎÊýÎÞЧ)
//y:ͼƬ×óÉϽÇÔÚLCDÖеÄyÖáλÖÃ(µ±²ÎÊýmodeΪ1ʱ£¬´Ë²ÎÊýÎÞЧ)
//member:  Ëõ·Å±ÈÀýµÄ·Ö×ÓÏî
//denom:Ëõ·Å±ÈÀýµÄ·ÖĸÏî
//·µ»ØÖµ:0 ÏÔʾÕý³£,ÆäËû ʧ°Ü
int displayjpegex(u8 *JPEGFileName,u8 mode,u32 x,u32 y,int member,int denom)
{char result;int XSize,YSize;float Xflag,Yflag;GUI_JPEG_INFO JpegInfo;result = f_open(&JPEGFile,(const TCHAR*)JPEGFileName,FA_READ);   //´ò¿ªÎļþ//Îļþ´ò¿ª´íÎóif(result != FR_OK)    return 1;GUI_JPEG_GetInfoEx(JpegGetData,&JPEGFile,&JpegInfo);XSize = JpegInfo.XSize;   //JPEGͼƬX´óСYSize = JpegInfo.YSize; //JPEGͼƬY´óСswitch(mode){case 0: //ÔÚÖ¸¶¨Î»ÖÃÏÔʾͼƬif((member == 1) && (denom == 1)) //ÎÞÐèËõ·Å£¬Ö±½Ó»æÖÆ{GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,x,y);//ÔÚÖ¸¶¨Î»ÖÃÏÔʾBMPͼƬ}else //·ñÔòͼƬÐèÒªËõ·Å{GUI_JPEG_DrawScaledEx(JpegGetData,&JPEGFile,x,y,member,denom);}break;case 1:  //ÔÚLCDÖмäÏÔʾͼƬif((member == 1) && (denom == 1)) //ÎÞÐèËõ·Å£¬Ö±½Ó»æÖÆ{//ÔÚLCDÖмäÏÔʾͼƬGUI_JPEG_DrawEx(JpegGetData,&JPEGFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);}else //·ñÔòͼƬÐèÒªËõ·Å{Xflag = (float)XSize*((float)member/(float)denom);Yflag = (float)YSize*((float)member/(float)denom);XSize = (lcddev.width-(int)Xflag)/2-1;YSize = (lcddev.height-(int)Yflag)/2-1;GUI_JPEG_DrawScaledEx(JpegGetData,&JPEGFile,XSize,YSize,member,denom);}break;}f_close(&JPEGFile);      //¹Ø±ÕBMPFileÎļþreturn 0;
}   void jpegdisplay_demo(void)
{GUI_SetBkColor(GUI_BLUE);GUI_SetColor(GUI_RED);GUI_SetFont(&GUI_FontHZ16);GUI_Clear();while(1){displyjpeg("0:/PICTURE/JPEG/ʵÀýͼƬ.jpg",0,0,0,  1,1);}
}
JpegGetData() 从外部存储器获取 JPEG 文件数据
displyjpeg ()
将 JPEG 图片加载到 RAM 中,并显示到 LCD 上,显示速度快,但是需要
大量的 RAM。
displyjpegex() 不需要将 JPEG 加载到 RAM 中,显示速度慢,但是不需要大量的 RAM。
jpegdisplay_demo () 本章实验的演示函数,在 LCD 上显示图片。

函数 JpegGetData ()用于从外部存储器中获取 JPEG 图片数据,在函数 displayjpegex()显示JPEG 图片的时候做为参数传递给 GUI_JPEG_GetInfoEx()。
函数 displyjpeg ()用于显示 JPEG 图片,该函数首先将 JPEG 图片的所有数据加载到 RAM中,然后调用 EMWIN 中的相应函数在 LCD 上显示加载到 RAM 中的 JPEG 图片,由于需要将
整副 JPEG 图片加载到 RAM 中,所以需要大量的 RAM,但是显示速度快!此函数可以设置要显示的 JPEG 图片的位置和放大倍数。
函数 displayjpegex ()也是显示 JPEG 图片的,与函数 displyjpeg ()不同的是,displayjpegex ()不需要将 JPEG 图片加载到 RAM 中,可以直接从外部存储器中读取 JPEG 图片并显示,这种方法需要的 RAM 小,但是速度相比 displyjpeg ()要慢,此函数也可以设置要显示的 JPEG 图片的位置和放大倍数。

为了了解每个函数怎么用的,例程已经被我修改了。

这是正点原子得现象。好好看一看还是能理解得。

STM32——EMWIN JPEG 图片显示(二十三)相关推荐

  1. STM32——EMWIN PNG 图片显示(二十五)

    EMWIN 文章目录 EMWIN 前言 一.RAM 使用 二.PNG 文件 API 函数 三.实验演示 前言 PNG 格式是一种图像格式,其目的是试图替代 GIF 和 TIFF 文件格式,同时增加一些 ...

  2. emwin读取sd图片_第12章emwin(ucgui)jpeg图片显示.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspwindows相关 第12章emwin(ucgui)jpeg图片 ...

  3. STM32正点原子图片——显示实验

    目录 一.图片显示部分 GIF piclib.c介绍 图像显示实验main.c介绍 二.SD卡模块 1.SD卡基础知识 2.SD卡读操作 3.SD卡写操作 一.图片显示部分 GIF GIF(Graph ...

  4. STM32——EMWIN对话框(十二)

    EMWIN 文章目录 EMWIN 前言 一.对话框基本原理 二.创建对话框 1.对话框资源表 2.对话框回调函数 3.对话框初始化 三.定义小工具功能 四.对话框API函数 1. GUI_Create ...

  5. STM32——EMWIN窗口小工具(十三)

    EMWIN 文章目录 EMWIN 前言 一.小工具基础知识 二. 如何使用小工具 1.重绘机制 2.小工具的使用 三.通用控件 API 函数 1.用于控件的 WM 函数 2.常用 API 函数 3._ ...

  6. 如何在python中显示电脑中的图片-python如何实现多个图片显示在屏幕上?

    pygame的三个方法(屏幕上显示需要的图片) yuhu102319582018-12-16 python将多幅图片显示在一张图片上 wugui1111116282018-06-15 iOS 图片显示 ...

  7. 《使用第三方库来显示jpeg图片》

    <使用第三方库来显示jpeg图片> ---------------------------------------------------------------------------- ...

  8. 【正点原子STM32连载】第四十八章 图片显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  9. framebuffer显示JPEG图片

    framebuffer显示JPEG图片 2011-05-03 20:14:45 分类: 嵌入式 转自http://www.linuxsense.org/archives/281.html http:/ ...

  10. [emWin]利用内存设备加速GIF图片显示——2021.03

    本文为作者原创,如需转载请在醒目位置标明原始出处,并提供可访问的超链接. 效果 实现原理 emWin的GIF显示原理是用户程序调用GUI_GIF_DrawSub()绘制函数一帧一帧的解码和显示,并且每 ...

最新文章

  1. JS设计模式(13)状态模式
  2. 盘点COVID-19新冠药物和疫苗研发进展
  3. CV:基于Keras利用训练好的hdf5模型进行目标检测实现输出模型中的脸部表情或性别的gradcam(可视化)
  4. ARM Linux.2.6.34内核移植
  5. Java进程CPU占用高导致的网页请求超时的故障排查
  6. sqlserver备份和恢复
  7. 理解响应式编程(RxJS)
  8. [转]PCM文件格式
  9. 项目调研的误区和关键点
  10. DWRUtil.addOptions
  11. python等比例压缩图片_Python批量按比例缩小图片脚本分享
  12. wps下一步快捷键_办公必备|终于整理完了这74个WPS最常用快捷键
  13. 多种视觉SLAM方案对比
  14. java.lang.IllegalArgumentException: requirement failed: indices should be one-based and in ascending
  15. 第九周项目六 三色球问题
  16. 谷歌浏览器升级后无法使用处理指引
  17. The 9-th BIT Campus Programming F. 狂乱(背包)
  18. vmware安装win10 Stopcode: KMODE EXCEPTION NOT HANDLED
  19. python爬虫 多线程 爬取网站排行榜上的所有小说
  20. 计算机插u盘抖动,u盘插入电脑闪蓝屏怎么办? 爱问知识人

热门文章

  1. java数学运算(Math类)
  2. A*寻路算法之解决目标点不可达问题
  3. 正向查找区域和反向查找区域的操作教程(内提供系统镜像下载)
  4. 微信H5生成海报图片并保存到手机
  5. Linux系统中xz命令用法详解(压缩和解压缩)
  6. 开放PLM——Aras Innovator编程学习(一)简介
  7. coreldraw2021永久序列号和激活注册教程
  8. 采用最终一致性解决微服务一致性问题
  9. plt.pcolormesh()中遇到TypeError:Dimensions of C (..., xxx) are incompatible with X (...) and/or Y (xxx)
  10. 在运维日常工作过程中遇到的一些问题,以及最终的解决方法!!(持续更新帖)