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


    目录

    学习目标

    图片格式

    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这个文件,起到了链接各个部分枢纽的作用。 

    代码

            给出部分代码。 

    1. _pic_info picinfo; //图片信息
    2. _pic_phy pic_phy; //图片显示物理接口
    3. //
    4. //lcd.h没有提供划横线函数,需要自己实现
    5. void piclib_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
    6. {
    7. if((len==0)||(x0>lcddev.width)||(y0>lcddev.height))return;
    8. LCD_Fill(x0,y0,x0+len-1,y0,color);
    9. }
    10. //填充颜色
    11. //x,y:起始坐标
    12. //width,height:宽度和高度。
    13. //*color:颜色数组
    14. void piclib_fill_color(u16 x,u16 y,u16 width,u16 height,u16 *color)
    15. {
    16. LCD_Color_Fill(x,y,x+width-1,y+height-1,color);
    17. }
    18. //
    19. //画图初始化,在画图之前,必须先调用此函数
    20. //指定画点/读点
    21. void piclib_init(void)
    22. {
    23. pic_phy.read_point=LCD_ReadPoint; //读点函数实现
    24. pic_phy.draw_point=LCD_Fast_DrawPoint; //画点函数实现
    25. pic_phy.fill=LCD_Fill; //填充函数实现
    26. pic_phy.draw_hline=piclib_draw_hline; //画线函数实现
    27. pic_phy.fillcolor=piclib_fill_color; //颜色填充函数实现
    28. picinfo.lcdwidth=lcddev.width; //得到LCD的宽度像素
    29. picinfo.lcdheight=lcddev.height;//得到LCD的高度像素
    30. picinfo.ImgWidth=0; //初始化宽度为0
    31. picinfo.ImgHeight=0;//初始化高度为0
    32. picinfo.Div_Fac=0; //初始化缩放系数为0
    33. picinfo.S_Height=0; //初始化设定的高度为0
    34. picinfo.S_Width=0; //初始化设定的宽度为0
    35. picinfo.S_XOFF=0; //初始化x轴的偏移量为0
    36. picinfo.S_YOFF=0; //初始化y轴的偏移量为0
    37. picinfo.staticx=0; //初始化当前显示到的x坐标为0
    38. picinfo.staticy=0; //初始化当前显示到的y坐标为0
    39. }
    40. //快速ALPHA BLENDING算法.
    41. //src:源颜色
    42. //dst:目标颜色
    43. //alpha:透明程度(0~32)
    44. //返回值:混合后的颜色.
    45. u16 piclib_alpha_blend(u16 src,u16 dst,u8 alpha)
    46. {
    47. u32 src2;
    48. u32 dst2;
    49. //Convert to 32bit |-----GGGGGG-----RRRRR------BBBBB|
    50. src2=((src<<16)|src)&0x07E0F81F;
    51. dst2=((dst<<16)|dst)&0x07E0F81F;
    52. //Perform blending R:G:B with alpha in range 0..32
    53. //Note that the reason that alpha may not exceed 32 is that there are only
    54. //5bits of space between each R:G:B value, any higher value will overflow
    55. //into the next component and deliver ugly result.
    56. dst2=((((dst2-src2)*alpha)>>5)+src2)&0x07E0F81F;
    57. return (dst2>>16)|dst2;
    58. }
    59. //初始化智能画点
    60. //内部调用
    61. void ai_draw_init(void)
    62. {
    63. float temp,temp1;
    64. temp=(float)picinfo.S_Width/picinfo.ImgWidth;
    65. temp1=(float)picinfo.S_Height/picinfo.ImgHeight;
    66. if(temp//取较小的那个
    67. if(temp1>1)temp1=1;
    68. //使图片处于所给区域的中间
    69. picinfo.S_XOFF+=(picinfo.S_Width-temp1*picinfo.ImgWidth)/2;
    70. picinfo.S_YOFF+=(picinfo.S_Height-temp1*picinfo.ImgHeight)/2;
    71. temp1*=8192;//扩大8192倍
    72. picinfo.Div_Fac=temp1;
    73. picinfo.staticx=0xffff;
    74. picinfo.staticy=0xffff;//放到一个不可能的值上面
    75. }
    76. //判断这个像素是否可以显示
    77. //(x,y) :像素原始坐标
    78. //chg :功能变量.
    79. //返回值:0,不需要显示.1,需要显示
    80. u8 is_element_ok(u16 x,u16 y,u8 chg)
    81. {
    82. if(x!=picinfo.staticx||y!=picinfo.staticy)
    83. {
    84. if(chg==1)
    85. {
    86. picinfo.staticx=x;
    87. picinfo.staticy=y;
    88. }
    89. return 1;
    90. }else return 0;
    91. }
    92. //智能画图
    93. //FileName:要显示的图片文件 BMP/JPG/JPEG/GIF
    94. //x,y,width,height:坐标及显示区域尺寸
    95. //fast:使能jpeg/jpg小图片(图片尺寸小于等于液晶分辨率)快速解码,0,不使能;1,使能.
    96. //图片在开始和结束的坐标点范围内显示
    97. u8 ai_load_picfile(const u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 fast)
    98. {
    99. u8 res;//返回值
    100. u8 temp;
    101. if((x+width)>picinfo.lcdwidth)return PIC_WINDOW_ERR; //x坐标超范围了.
    102. if((y+height)>picinfo.lcdheight)return PIC_WINDOW_ERR; //y坐标超范围了.
    103. //得到显示方框大小
    104. if(width==0||height==0)return PIC_WINDOW_ERR; //窗口设定错误
    105. picinfo.S_Height=height;
    106. picinfo.S_Width=width;
    107. //显示区域无效
    108. if(picinfo.S_Height==0||picinfo.S_Width==0)
    109. {
    110. picinfo.S_Height=lcddev.height;
    111. picinfo.S_Width=lcddev.width;
    112. return FALSE;
    113. }
    114. if(pic_phy.fillcolor==NULL)fast=0;//颜色填充函数未实现,不能快速显示
    115. //显示的开始坐标点
    116. picinfo.S_YOFF=y;
    117. picinfo.S_XOFF=x;
    118. //文件名传递
    119. temp=f_typetell((u8*)filename); //得到文件的类型
    120. switch(temp)
    121. {
    122. case T_BMP:
    123. res=stdbmp_decode(filename); //解码bmp
    124. break;
    125. case T_JPG:
    126. case T_JPEG:
    127. res=jpg_decode(filename,fast); //解码JPG/JPEG
    128. break;
    129. case T_GIF:
    130. res=gif_decode(filename,x,y,width,height); //解码gif
    131. break;
    132. default:
    133. res=PIC_FORMAT_ERR; //非图片格式!!!
    134. break;
    135. }
    136. return res;
    137. }
    138. //动态分配内存
    139. void *pic_memalloc (u32 size)
    140. {
    141. return (void*)mymalloc(SRAMIN,size);
    142. }
    143. //释放内存
    144. void pic_memfree (void* mf)
    145. {
    146. myfree(SRAMIN,mf);
    147. }

    总结 

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

  • 相关阅读:
    10.3作业
    基于JAVA商超销售系统计算机毕业设计源码+数据库+lw文档+系统+部署
    金仓数据库 KingbaseGIS 使用手册(3. KGIS插件安装说明)
    MongoDB数据库(10亿条数据)清理策略: 自动化过期数据删除实战
    【计算机视觉】在计算机视觉里,传统卷积已经彻底输给Transformer了吗?
    TOWER 成就徽章 NFT 系列介绍——TOWER 生态系统的第一个灵魂通证(SBT)
    uniapp 复制功能,ios复制不了,h5复制不了,部分浏览器无法复制
    排序算法题型
    Javascript尚硅谷笔记
    持续交付探索与实践(三):指标度量体系搭建
  • 原文地址:https://blog.csdn.net/weixin_66578482/article/details/127604955