一、常见图片格式:

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——图像显示相关推荐

  1. STM32+ov7725+ESP8266实现无线图传-完成上位机图像显示

    一.需求 stm32f407探索者开发板和STM32F103ZET6战舰开发板.接正点原子ov5640.OV7725.OV2640摄像头,通过esp8266Wi-Fi模块(透传模式)将摄像头采集到的r ...

  2. stm32的IIC驱动0.96OLED

    IIC原理介绍: IIC是一个总线的结构但不支持总线协议 OLED介绍: 一.0.96寸OLED屏幕介绍 本文采用的是4针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的 ...

  3. 基于STM32的多功能MP3设计 毕业设计(论文)开题报告

    中国计量学院 毕业设计(论文)开题报告 学生姓名:卢杰学 号:XXXXXXXXX 专    业:电子科学与技术 班    级:10电子1 设计(论文)题目: 基于STM32的多功能MP3设计 指导教师 ...

  4. STM32学习笔记(十七)TLTLCD显示实验

    STM32F103ZET6之TLTLCD显示实验 文章目录 STM32F103ZET6之TLTLCD显示实验 前言 一.基本原理 1.简介 2.RGB565格式 3.FSMC(相关知识较多,略) 二. ...

  5. 基于STM32的OV7725摄像头拍照实验

    平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子) 工程介绍:需要 ...

  6. STM32毕业设计——基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码)——六足机器人控制系统

    基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+JAVA+Android的六足机器人控制系统设计与实现,文章末尾附有 ...

  7. 基于RK3399+STM32+PID的四轴飞行器跟踪与控制系统设计

    系统硬件的总体方案设计 要设计一款具有跟踪功能且飞行稳定的四轴飞行器跟踪系统,首先要保证系 统硬件平台的功能稳定.系统各模块具有不同功能,所以需要根据各模块功能与 性能,进行芯片的选取与硬件电路设计, ...

  8. STM32 F103 基础实验

    索引          [1]led灯实验         [2]定时器计时         [3]矩阵按键         [4]OLED显示实验                        [4 ...

  9. 【毕业设计】基于单片机红外热成像仪 - stm32 物联网 嵌入式

    文章目录 1 简介 2 项目简介 3 主要器件 3.1 MLX90640红外摄像头模块 3.1.1 模块特性 3.1.2相关参数 3.1.2 应用场景 3.1.3 接口说明(以接入 MCU 为例): ...

最新文章

  1. angularJs 之deferred
  2. 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
  3. jsp接收 input文本输入框中,无法正确显示单引号和双引号的问题
  4. Java黑皮书课后题第6章:*6.4(反序显示一个整数)使用下面的方法体编写方法,反序显示一个整数…例如reverse(3456)返回6543,编写一个测试程序,提示用户输入一个整数,然后显示它的反序
  5. 利用VC检测程序内存溢出(转)
  6. 2的幂次方表示(信息学奥赛一本通-T1208)
  7. CentOS开启samba服(附smb.conf手册)
  8. java 怎么启动线程_线程如何正确的启动
  9. web项目怎么打包上线_如何打包发布Web Application应用程序
  10. 深度学习前沿技术摘要
  11. 小米手机隐私相册在哪?将你的照片锁进“保险柜”
  12. 人体检测模块的——微波雷达的推荐和使用
  13. mysql中解决“SELECT command denied to user ‘nature‘@‘192.168.1.49‘ for table ‘user_variables_by_thread‘“
  14. 1.两数之和(python)
  15. ROS机器人(一) -- 环境搭建
  16. 状态压缩Dp模板-玉米田
  17. 30岁软件测试,目前已失业4个月,迷茫不知该怎么办?
  18. EN 14915实木镶板和包层—CE认证
  19. 2021 蓝桥杯省赛第一场 C++ 大学 B 组
  20. 用Python3.6来做维基百科中文语料

热门文章

  1. 碧瑶答疑网—选题报告和项目需求规格说明书
  2. oracle 四舍五入日期,Oracle时间运算(日期截取及四舍五入)
  3. 法国体验周:在元宇宙中庆祝法国文化!
  4. Transformer论文解读一(Transformer)
  5. 5G电源能源行业的变化
  6. 流星蝴蝶剑秘籍代码_代码,学习,共享:开发人员成功秘诀
  7. mysql mts_MySQL进一步完善可用并行复制-MTS并行增量的应用-爱可生
  8. repo manifest.xml详解
  9. Centos7安装aeneas ffmpeg实现字幕音视频自动强制对齐
  10. 快过年了,给朋友来一段加密祝福会不会太秀?