(48)STM32——图片显示实验

news/2025/2/1 16:43:06/

目录

学习目标

图片格式

BMP

组成

JPG

GIF

介绍

代码

总结 


学习目标

        本节要学习的是使用单片机来显示图片,但是因为目前SD卡还没有图片,暂时做不了实验,等我把图片放到SD卡之后再把实验补上。

图片格式

BMP

  • 全称BitMap,是Windows中的标准图像文件格式,后缀名为:“.bmp”。
  • 采用位映射存储方式,除图像深度可选外,不做任何压缩。
  • 图像深度可选:1、4、8、16、24、32bit。
  • BMP文件存储数据时,图像的扫描方式是按照从左到右、从上到小的顺序。
  • 优点:但是没有任何失真,图片保存完好。
  • 缺点:图片占用空间大。

组成

  1. 位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
  2. 位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
  3. 调色板,这个部分可选,有些位图需要调色板,有些位图不需要调色板(比如:24位的BMP);
  4. 位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

JPG

  • JPG是Joint  Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。后缀名为:“.JPEG”
  • JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像处理领域。
  • 采用有损压缩格式,能够将图像压缩在很小的存储空间。压缩技术先进,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别。压缩比越大品质越低。
  • 在图像质量和存储空间之间选择一个平衡点

GIF

  • GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompusServe公司在1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。
  • GIF主要分为两个版本:GIF89a和GIF87a
    • GIF 87a:是在1987年制定的版本;
    • GIF 89a:是在1989年制定的版本;

介绍

        主要是piclib.c这个文件,起到了链接各个部分枢纽的作用。 

代码

        给出部分代码。 

_pic_info picinfo;	 	//图片信息
_pic_phy pic_phy;		//图片显示物理接口	
//
//lcd.h没有提供划横线函数,需要自己实现
void piclib_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
{if((len==0)||(x0>lcddev.width)||(y0>lcddev.height))return;LCD_Fill(x0,y0,x0+len-1,y0,color);	
}
//填充颜色
//x,y:起始坐标
//width,height:宽度和高度。
//*color:颜色数组
void piclib_fill_color(u16 x,u16 y,u16 width,u16 height,u16 *color)
{  LCD_Color_Fill(x,y,x+width-1,y+height-1,color);	
}
//
//画图初始化,在画图之前,必须先调用此函数
//指定画点/读点
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
}
//快速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;  
}
//初始化智能画点
//内部调用
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;//放到一个不可能的值上面			 										    
}   
//判断这个像素是否可以显示
//(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;
}
//智能画图
//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;
}
//动态分配内存
void *pic_memalloc (u32 size)			
{return (void*)mymalloc(SRAMIN,size);
}
//释放内存
void pic_memfree (void* mf)		 
{myfree(SRAMIN,mf);
}

总结 

        感觉只是知道如何使用,关于解码部分还不会,还有许多代码没搞懂,等以后再来慢慢琢磨吧 。


http://www.ppmy.cn/news/812733.html

相关文章

几种开源GPU驱动(NV/AMD/Intel)编译架构分析

2022年5月,社区终于等到了这一天,NVIDIA开源了他们的LINUX GPU 内核驱动, Linux 内核总设计师 Linus Torvalds 十年前说过的一句话,大概意思是英伟达是LINUX开发者遇到的硬件厂商中最麻烦的一个,说完这句话之后,祖师爷毫不客气的朝着镜头竖了中指并表达了对NVIDIA身体某部…

idb 怎么回复mysql_mysql中的.idb文件 怎么正常显示

2017-02-18 回答 【mysql文件】 mysql是一个关系型数据库管理系统&#xff0c;由瑞典mysql ab 公司开发&#xff0c;目前属于 oracle 旗下公司。mysql 最流行的关系型数据库管理系统&#xff0c;在 web 应用方面mysql是最好的 rdbms (relational database management system&am…

Foundry教程:ERC-20代币智能合约从编写到部署全流程开发

概述 如果你想获得更好的阅读体验&#xff0c;请前往我的博客 本博客的内容主要分为以下四部分&#xff1a; 一是Foundry的介绍与安装&#xff0c;主要介绍为什么选择Foundry进行智能合约开发和安装过程中的各种官方文档中未提及的问题&#xff1b; 二是智能合约的编写&…

Day01人工智能学习---环境安装与配置

从今天开始自学人工智能&#xff0c;并且每天记录学习过程与反思&#xff0c;希望能帮助遇到和我同样难题的学习者们&#xff0c;鄙人不才&#xff0c;我没遇到的情况也不太会处理&#xff0c;因为每个人电脑性能与使用情况不同&#xff0c;如果小伙伴你遇到其他的问题可以在CS…

树莓派4b镜像烧录以及如何无显示屏远程登陆操作

1、树莓派的烧录&#xff1a; 树莓派的烧录我用了很长的时间&#xff0c;重新烧录的很多次&#xff0c;都是因为没办法打开ssh&#xff0c;所以没办法进入树莓派调试。 因为我使用树莓派主要是用来部署yolov5进行识别物体的&#xff0c;所以我找遍csdn终于找到了一个可以使用的…

物联网不求人-人工智能So easy

物联网不求人-人工智能So easy 随着近几年人工智能的兴起&#xff0c;让我们的生活发生了翻天覆地的改变&#xff0c;任何普通的东西经过AI的加持都变得更加智能和实用&#xff0c;其工作的效率与传统方式相比更有着质的提升。随着人工智能这股春风的到来不少大厂纷纷嗅到商机推…

Vue指令--v-if、v-show、v-for

目录 v-if和v-show指令的展示如下&#xff1a; v-for指令的展示如下&#xff1a; v-if和v-show指令的展示如下&#xff1a; v-if指令具有两个配套的指令v-else-if和v-else进行条件判断来决定是否渲染展示某元素 具体代码展示如下&#xff1a;&#xff08;代码中的注释值得一…

并行程序设计 pthread

配置环境 pthread是c的扩展库&#xff0c;需要配置环境&#xff0c;不过vscode的mingw里面本来就有&#xff0c;谢谢呢^_^ cd “d:\sylvia\文件夹等等等” ; if ($?) { g helloworld.cpp -o helloworld } ; //编译 if ($?) { .\helloworld 线程数} //运行 常用变量声明及函…