STM32——图像显示
一、常见图片格式:
1、BMP
2、JPEG(JPG)
3、GIF:动态
BMP:
1、全称BitMap,是Windows中的标准图像文件格式,后缀名为:“.bmp”。
2、采用位映射存储方式,除图像深度可选外,不做任何压缩。
3、图像深度可选:1、4、8、16、24、32bit。
4、BMP文件存储数据时,图像的扫描方式是按照从左到右、从上到小的顺序。
5、优缺点:图片占用空间大,但是没有任何失真,图片保存完好。
典型的BMP图像文件由四部分组成:
1、位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2、位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3、调色板,这个部分可选,有些位图需要调色板,有些位图不需要调色板(比如:24位的BMP);
4、位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
JPG:
1、JPG是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。后缀名为:“.JPEG”
2、JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像处理领域。
3、采用有损压缩格式,能够将图像压缩在很小的存储空间。压缩技术先进,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别。压缩比越大品质越低。
4、在图像质量和存储空间之间选择一个平衡点
GIF:
1、GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompusServe公司在1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。
2、GIF主要分为两个版本:GIF89a和GIF87a
GIF 87a:是在1987年制定的版本;GIF 89a:是在1989年制定的版本;
二、实验代码
软件设计部分:PICTURE部分解码图片(包含四个文件:bmp.c gif.c piclib.c tjpgd.c)
bmp.c对应BMP格式图片的解码
gif.c对应GIF格式图片的解码
tjpgd.c对应JPEG(JPG)格式图片的解码
piclib.c为图片解码函数入口,里面有一个很重要的函数来提供图片解码的入口(ai_load_picfile函数)
根据不同的图片格式,进入相应的解码函数:
temp=f_typetell((u8*)filename);//得到文件类型
switch(temp)
{case T_BMP:res=stdbmp_decode(filename);//解码BMPcase T_JPG:case T_JPEG:res=jpg_decode(filename,fast);//解码JPG/JPEGcase T_GIF:res=gif_decode(filename,x,y,width,height);//解码GIFdefault:res=PIC_FORMAT_ERR;//非图片格式break;
}
piclib函数的详细作用:
1、函数内部含有公共函数,供GIF、JPEG、BMP函数解码图片的时候调用
2、函数内部含有一个区分图片格式的函数,用来区分图片格式从而使不同格式的图片进入不同的解码函数
3、图片解析后还需要显示在LCD上面,piclib函数中还包含将解码后的图片显示在LCD上面的函数。
piclib.h中的结构体函数:
typedef struct
{u16(*read_point)(u16,u16); //u16 read_point(u16 x,u16 y)读点函数void(*draw_point)(u16,u16,u16); //void draw_point(u16 x,u16 y,u16 color)画点函数void(*fill)(u16,u16,u16,u16,u16); ///void fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)单色填充函数 void(*draw_hline)(u16,u16,u16,u16); //void draw_hline(u16 x0,u16 y0,u16 len,u16 color)画水平线函数void(*fillcolor)(u16,u16,u16,u16,u16*); //void piclib_fill_color(u16 x,u16 y,u16 width,u16 height,u16 *color)颜色填充函数
}_pic_phy;
extern _pic_phy pic_phy;
typedef struct
{ u16 lcdwidth; //LCD的宽度u16 lcdheight; //LCD的高度u32 ImgWidth; //图像实际的宽度和高度u32 ImgHeight;u32 Div_Fac; //缩放系数(扩大了8192倍的)u32 S_Height; //设定的宽度和高度u32 S_Width;u32 S_XOFF; //X、Y轴的偏移量u32 S_YOFF;u32 staticx; //当前显示的x和y轴的坐标u32 staticy;
}_pic_info;
extern _pic_info picinfo;//图像信息
piclib.c中的函数:
1、piclib_init函数
//画图初始化,在画图之前必须先调用此函数
//指定画点/读点
void piclib_init(void)
{pic_phy.read_point=LCD_ReadPoint; //读点函数实现pic_phy.draw_point=LCD_Fast_DrawPoint; //画点函数实现pic_phy.fill=LCD_Fill; //填充函数实现pic_phy.draw_hline=piclib_draw_hline; //画线函数实现pic_phy.fillcolor=piclib_fill_color; //颜色填充函数实现picinfo.lcdwidth=lcddev.width; //得到LCD的宽度像素picinfo.lcdheight=lcddev.height;//得到LCD的高度像素picinfo.ImgWidth=0; //初始化宽度为0picinfo.ImgHeight=0;//初始化高度为0picinfo.Div_Fac=0; //初始化缩放系数为0picinfo.S_Height=0; //初始化设定高度为0picinfo.S_Width=0; //初始化设定宽度为0picinfo.S_XOFF=0; //初始化X轴的偏移量为0picinfo.S_YOFF=0; //初始化Y轴的偏移量为0picinfo.staticx=0; //初始化当前显示到的x坐标为0picinfo.staticy=0; //初始化当前显示到的y坐标为0
}
2、piclib_alpha_blend函数
//快速ALPHA BLENDING算法.
//src:源颜色
//dst:目标颜色
//alpha:透明程度(0~32)
//返回值:混合后的颜色.
u16 piclib_alpha_blend(u16 src,u16 dst,u8 alpha)
{u32 src2;u32 dst2; //Convert to 32bit |-----GGGGGG-----RRRRR------BBBBB|src2=((src<<16)|src)&0x07E0F81F;dst2=((dst<<16)|dst)&0x07E0F81F; //Perform blending R:G:B with alpha in range 0..32//Note that the reason that alpha may not exceed 32 is that there are only//5bits of space between each R:G:B value, any higher value will overflow//into the next component and deliver ugly result.dst2=((((dst2-src2)*alpha)>>5)+src2)&0x07E0F81F;return (dst2>>16)|dst2;
}
3、ai_draw_init函数
//初始化智能画点
//内部调用
void ai_draw_init(void)
{float temp,temp1; temp=(float)picinfo.S_Width/picinfo.ImgWidth;temp1=(float)picinfo.S_Height/picinfo.ImgHeight; if(temp<temp1)temp1=temp;//取较小的那个 if(temp1>1)temp1=1; //使图片处于所给区域的中间picinfo.S_XOFF+=(picinfo.S_Width-temp1*picinfo.ImgWidth)/2;picinfo.S_YOFF+=(picinfo.S_Height-temp1*picinfo.ImgHeight)/2;temp1*=8192;//扩大8192倍 picinfo.Div_Fac=temp1;picinfo.staticx=0xffff;picinfo.staticy=0xffff;//放到一个不可能的值上面
}
4、is_element_ok函数
//判断这个像素是否可以显示
//(x,y) :像素原始坐标
//chg :功能变量.
//返回值:0,不需要显示.1,需要显示
u8 is_element_ok(u16 x,u16 y,u8 chg)
{ if(x!=picinfo.staticx||y!=picinfo.staticy){if(chg==1){picinfo.staticx=x;picinfo.staticy=y;} return 1;}else return 0;
}
5、ai_load_picfile函数
//智能画图
//FileName:要显示的图片文件 BMP/JPG/JPEG/GIF
//x,y,width,height:坐标及显示区域尺寸
//fast:使能jpeg/jpg小图片(图片尺寸小于等于液晶分辨率)快速解码,0,不使能;1,使能.
//图片在开始和结束的坐标点范围内显示
u8 ai_load_picfile(const u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 fast)
{ u8 res;//返回值u8 temp; if((x+width)>picinfo.lcdwidth)return PIC_WINDOW_ERR; //x坐标超范围了.if((y+height)>picinfo.lcdheight)return PIC_WINDOW_ERR; //y坐标超范围了. //得到显示方框大小 if(width==0||height==0)return PIC_WINDOW_ERR; //窗口设定错误picinfo.S_Height=height;picinfo.S_Width=width;//显示区域无效if(picinfo.S_Height==0||picinfo.S_Width==0){picinfo.S_Height=lcddev.height;picinfo.S_Width=lcddev.width;return FALSE; }if(pic_phy.fillcolor==NULL)fast=0;//颜色填充函数未实现,不能快速显示//显示的开始坐标点picinfo.S_YOFF=y;picinfo.S_XOFF=x;//文件名传递 temp=f_typetell((u8*)filename); //得到文件的类型switch(temp){ case T_BMP:res=stdbmp_decode(filename); //解码bmp break;case T_JPG:case T_JPEG:res=jpg_decode(filename,fast); //解码JPG/JPEG break;case T_GIF:res=gif_decode(filename,x,y,width,height); //解码gif break;default:res=PIC_FORMAT_ERR; //非图片格式!!! break;} return res;
}
STM32——图像显示相关推荐
- STM32+ov7725+ESP8266实现无线图传-完成上位机图像显示
一.需求 stm32f407探索者开发板和STM32F103ZET6战舰开发板.接正点原子ov5640.OV7725.OV2640摄像头,通过esp8266Wi-Fi模块(透传模式)将摄像头采集到的r ...
- stm32的IIC驱动0.96OLED
IIC原理介绍: IIC是一个总线的结构但不支持总线协议 OLED介绍: 一.0.96寸OLED屏幕介绍 本文采用的是4针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的 ...
- 基于STM32的多功能MP3设计 毕业设计(论文)开题报告
中国计量学院 毕业设计(论文)开题报告 学生姓名:卢杰学 号:XXXXXXXXX 专 业:电子科学与技术 班 级:10电子1 设计(论文)题目: 基于STM32的多功能MP3设计 指导教师 ...
- STM32学习笔记(十七)TLTLCD显示实验
STM32F103ZET6之TLTLCD显示实验 文章目录 STM32F103ZET6之TLTLCD显示实验 前言 一.基本原理 1.简介 2.RGB565格式 3.FSMC(相关知识较多,略) 二. ...
- 基于STM32的OV7725摄像头拍照实验
平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子) 工程介绍:需要 ...
- STM32毕业设计——基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码)——六足机器人控制系统
基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+JAVA+Android的六足机器人控制系统设计与实现,文章末尾附有 ...
- 基于RK3399+STM32+PID的四轴飞行器跟踪与控制系统设计
系统硬件的总体方案设计 要设计一款具有跟踪功能且飞行稳定的四轴飞行器跟踪系统,首先要保证系 统硬件平台的功能稳定.系统各模块具有不同功能,所以需要根据各模块功能与 性能,进行芯片的选取与硬件电路设计, ...
- STM32 F103 基础实验
索引 [1]led灯实验 [2]定时器计时 [3]矩阵按键 [4]OLED显示实验 [4 ...
- 【毕业设计】基于单片机红外热成像仪 - stm32 物联网 嵌入式
文章目录 1 简介 2 项目简介 3 主要器件 3.1 MLX90640红外摄像头模块 3.1.1 模块特性 3.1.2相关参数 3.1.2 应用场景 3.1.3 接口说明(以接入 MCU 为例): ...
最新文章
- angularJs 之deferred
- 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
- jsp接收 input文本输入框中,无法正确显示单引号和双引号的问题
- Java黑皮书课后题第6章:*6.4(反序显示一个整数)使用下面的方法体编写方法,反序显示一个整数…例如reverse(3456)返回6543,编写一个测试程序,提示用户输入一个整数,然后显示它的反序
- 利用VC检测程序内存溢出(转)
- 2的幂次方表示(信息学奥赛一本通-T1208)
- CentOS开启samba服(附smb.conf手册)
- java 怎么启动线程_线程如何正确的启动
- web项目怎么打包上线_如何打包发布Web Application应用程序
- 深度学习前沿技术摘要
- 小米手机隐私相册在哪?将你的照片锁进“保险柜”
- 人体检测模块的——微波雷达的推荐和使用
- mysql中解决“SELECT command denied to user ‘nature‘@‘192.168.1.49‘ for table ‘user_variables_by_thread‘“
- 1.两数之和(python)
- ROS机器人(一) -- 环境搭建
- 状态压缩Dp模板-玉米田
- 30岁软件测试,目前已失业4个月,迷茫不知该怎么办?
- EN 14915实木镶板和包层—CE认证
- 2021 蓝桥杯省赛第一场 C++ 大学 B 组
- 用Python3.6来做维基百科中文语料
热门文章
- 碧瑶答疑网—选题报告和项目需求规格说明书
- oracle 四舍五入日期,Oracle时间运算(日期截取及四舍五入)
- 法国体验周:在元宇宙中庆祝法国文化!
- Transformer论文解读一(Transformer)
- 5G电源能源行业的变化
- 流星蝴蝶剑秘籍代码_代码,学习,共享:开发人员成功秘诀
- mysql mts_MySQL进一步完善可用并行复制-MTS并行增量的应用-爱可生
- repo manifest.xml详解
- Centos7安装aeneas ffmpeg实现字幕音视频自动强制对齐
- 快过年了,给朋友来一段加密祝福会不会太秀?