LCD屏显示图片习题【一】

news/2024/9/25 7:23:23

目录
  • LCD屏显示图片习题
    • 题目
    • 解析
    • 代码完整展示

LCD屏显示图片习题

题目

image

解析

​ 该题的显著要求有两个,一是任意位置,二是任意大小。为满足这两个要求得先读取并记录bmp数据,且bmp文件属于普通文件,所以选择标准IO函数fopen()打开bmp,并用结构体变量进行记录;然后为了提升用户使用体验,即bmp在显示时不会出现黑线,对LCD屏进行内存映射,最后使用获取到的x1和y1作为循环条件,完成任意大小的bmp在任意位置显示。

image

代码完整展示

/*******************************************************************
*
*	file name:	ShowBmp.c
*	author	 :  790557054@qq.com
*	date	 :  2024/05/13
*	function :  该案例是掌握LCD屏显示图片的基本原理
* 	note	 :  None
*
*	CopyRight (c)  2023-2024   790557054@qq.com   All Right Reseverd 
*
* *****************************************************************/#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>//取消字节对齐
#pragma pack(1)// 定义BMP文件头部结构
typedef struct{unsigned short bfType;unsigned int   bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned int   bfOffBits;
}BITMAPFILEHEADER;typedef struct{unsigned int biSize;int biWidth;				//宽int biHeight;				//高unsigned short biPlanes;unsigned short biBitCount;	//色深unsigned int biCompression;unsigned int biSizeImage;int biXPelsPerMeter;int biYPelsPerMeter;unsigned int biClrUsed;unsigned int biClrImportant;
}BITMAPINFOHEADER;//恢复字节对齐
#pragma pack()/********************************************************************
*
*	name	 :	ShowBmp
*	function :  实现任意图片大小在任意位置进行显示
*	argument :
*				@fname  :需要显示的图片文件路径@x1 	:图片显示位置的横坐标@y1		:图片显示位置的横坐标
*
*	retval	 :  调用成功返回0,否则返回-1;
*	author	 :  790557054@qq.com
*	date	 :  2024/05/13
* 	note	 :  none
*
* *****************************************************************/
int ShowBmp(const char *fname,int x1,int y1)
{//1.打开待显示的BMP图像  fopenFILE * bmp_fp = fopen(fname,"rb");if (NULL == bmp_fp){return -1;}//2.读取BMP文件的图像信息,获取BMP的宽和高BITMAPINFOHEADER headerinfo;BITMAPFILEHEADER fileinfo;fseek(bmp_fp,14,SEEK_SET);fread(&headerinfo,1,40,bmp_fp); //读取40字节printf("bmp width = %d,height = %d\n",headerinfo.biWidth,headerinfo.biHeight);//3.读取BMP图片的颜色分量  800*480*3char *bmp_buf= calloc(1,3*(headerinfo.biWidth)*(headerinfo.biHeight));fread(bmp_buf,1,3*(headerinfo.biWidth)*(headerinfo.biHeight),bmp_fp);//4.关闭BMPfclose(bmp_fp);//5.打开LCD   open  int lcd_fd = open("/dev/fb0",O_RDWR);//6.对LCD进行内存映射  mmapint * lcd_mp = (int *)mmap(NULL,4*800*480,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);//7.循环的把BMP图像的颜色分量依次写入到LCD的像素点中 int i = 0;int data = 0;//设置图片位置的关键在于循环条件,且要注意映射时需要从图片最后一行开始for (int y = 480 - (480 - headerinfo.biHeight - y1) - 1; y >= y1; y--){for (int x = x1; x < headerinfo.biWidth + x1; ++x){//把BMP图片的一个像素点的颜色分量转换为LCD屏幕的一个像素点的颜色分量格式  ARGB <--- BGRdata |= bmp_buf[i];			//Bdata |= bmp_buf[i+1]<<8;	//Gdata |= bmp_buf[i+2]<<16;  	//Rlcd_mp[800*y + x] = data;  //BGR BGR BGR .... i+=3;  data = 0;}}//8.关闭LCDclose(lcd_fd);munmap(lcd_mp,800*480*4);return 0;
}
int main(int argc, char const *argv[])
{int x1 = 0, y1 = 0;//获取用户想要的图片显示位置printf("Please input x1 = \n");scanf("%d", &x1);printf("Please input y1 = \n");scanf("%d", &y1);//调用显示函数ShowBmp(argv[1],x1,y1);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【ubuntu】程序运行时的任务栏图标

1. 快捷方式需要正确的配置StartupWMClass属性,那么如何获取这个属性呢?参考如下命令xprop | grep WM_CLASS将终端程序小窗运行上述命令,鼠标点击哪个应用窗体就会获取哪个窗体的名称,有可能会有多个,多个情况任选其一 2. 将图标复制到 /usr/share/pixmaps/ 中,文心一言的…

Visual Studio中的四款代码格式化工具

前言 今天大姚给大家分享四款Visual Studio中的代码格式化工具、扩展插件。大家可以在Visual Studio中的管理扩展或者插件市场下载安装。 代码格式化工具的作用 自动调整代码的布局和风格,以确保代码具有统一的格式,提高可读性并减少潜在的错误。 Visual Studio中的管理扩展插…

【译】使用 GitHub Copilot 作为你的编码 GPS

GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程。GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程。在我们的视频系列中,Bruno Capuano 探讨了这个智能编码伙伴如何帮助您更…

[转帖]mkcert

https://github.com/FiloSottile/mkcert mkcert is a simple tool for making locally-trusted development certificates. It requires no configuration.$ mkcert -install Created a new local CA 💥 The local CA is now installed in the system trust store! ⚡️ The …

读人工智能时代与人类未来笔记01_重塑人类社会秩序

读人工智能时代与人类未来笔记01_重塑人类社会秩序1. AlphaZero 1.1. 2017年年底,由谷歌旗下DeepMind公司开发的人工智能程序AlphaZero击败了当时世界上最强大的国际象棋程序Stockfish 1.1.1. AlphaZero对Stockfish的百场战绩是28胜72平0负,可以说获…

[转帖]Nginx(四)虚拟主机

说明: 各个指令块在具体的应用场景再进行说明 一 虚拟主机 一个web服务里面就是一个独立的网站站点,这个站点对应独立的域名或者IP或者端口 特点:具有独立的程序及资源目录,可以独立的对外提供服务供用户访问! +++++++++++++++++++ 分割线 +++++++++++++++++++ 虚拟主机…

大吴雨逝键

。无需多言,

免杀初探

刚开始看点免杀的东西,做下笔记。0x00 概念 免杀是反病毒技术,指的是一种能使病毒木马免于被杀毒软件查杀的技术。免杀的最基本思想就是破坏特征,可以是特征码,也可以是行为特征,以这种思路修改病毒、木马的内容,来对抗杀软。 网上的开源测试项目在短时间内就会被安全厂商…