自定义函数在LCD上显示一张不超过LCD像素大小的色深为 24bit的bmp图片

news/2024/9/25 20:22:21

设计程序实现在LCD上任意位置显示一张任意大小的色深为 24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。

头文件包含

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <strings.h>
//以1字节对齐方式对齐
#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()
/*********************************************************************	函数名称:	ShowBmp*	函数功能:   在LCD上任意位置显示一张任意大小的色深为 24bit的bmp图片*	函数参数:*				@name 	bmp图像文件名*				@x		图像显示的起点x轴坐标*				@y		图像显示的起点y轴左边*				@lcd_mp	lcd屏内存映射的地址*	返回结果:* 	注意事项:   None* 	函数作者:   mailLinL@163.com*	创建日期:   2024/05/12*	修改历史:*	函数版本:	V1.0* *****************************************************************/
int ShowBmp(char *name, int x, int y, int *lcd_mp)
{// 1.打开待显示的BMP图像  fopenFILE *bmp_fp = fopen(name, "rb");if (NULL == bmp_fp){printf("open FILE is error!\n");return -1;}// 2.读取BMP文件的图像信息,获取BMP的宽和高BITMAPINFOHEADER headinfo;fseek(bmp_fp, 14, SEEK_SET);fread(&headinfo, 1, 40, bmp_fp); // 读取40字节// 打开LCD   openint lcd_fd = open("/dev/fb0", O_RDWR);if (lcd_fd == -1){printf("mmap for lcd is error\n");return -1;}// 调用LCD屏的像素struct fb_var_screeninfo lcd_vinfo;ioctl(lcd_fd, FBIOGET_VSCREENINFO, &lcd_vinfo);// 3.读取BMP图片的颜色分量char bmp_buf[headinfo.biWidth * headinfo.biHeight * 3];bzero(bmp_buf, headinfo.biWidth * headinfo.biHeight * 3);fread(bmp_buf, 1, headinfo.biWidth * headinfo.biHeight * 3, bmp_fp);printf("bmp width = %d,height = %d\n", headinfo.biWidth, headinfo.biHeight);// 4.关闭BMPfclose(bmp_fp);// 5.循环将bmp图像写入lcd屏指定位置int data = 0;int i = 0;for (int h = (y + headinfo.biHeight - 1); h >= y; h--){for (int w = x; w < (x + headinfo.biWidth); w++){data |= bmp_buf[i];data |= bmp_buf[i + 1] << 8;data |= bmp_buf[i + 2] << 16;lcd_mp[h * (lcd_vinfo.xres) + w] = data;i += 3;data = 0;}}// 关闭LCDclose(lcd_fd);munmap(lcd_mp, lcd_vinfo.xres * lcd_vinfo.yres * 4);return 0;
}
int main(int argc, char *argv[])
{if (argc != 2){printf("argument is error!\n");return -1;}if (NULL == argv[1]){printf("argument 2 is error!\n");return -1;}// 打开LCD   openint lcd_fd = open("/dev/fb0", O_RDWR);if (lcd_fd == -1){printf("mmap for lcd is error\n");return -1;}// 调用LCD屏的像素struct fb_var_screeninfo lcd_vinfo;ioctl(lcd_fd, FBIOGET_VSCREENINFO, &lcd_vinfo);// 对LCD进行内存映射  mmapint *lcd_mp = (int *)mmap(NULL,lcd_vinfo.xres * lcd_vinfo.yres * 4,PROT_READ | PROT_WRITE,MAP_SHARED,lcd_fd,0);// 键盘输入图片显示的起始位置int x, y;scanf("%d%d", &x, &y);ShowBmp(argv[1], x, y, lcd_mp);// 关闭LCDmunmap(lcd_mp, lcd_vinfo.xres * lcd_vinfo.yres * 4);close(lcd_fd);return 0;
}

测试结果

image
image

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

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

相关文章

实验二 电子公文传输系统安全——读书笔记

《The.Security.Development.Lifecycle.CN.软件安全开发生命周期》 第一部分 对SDL的需求 隐私与安全: 隐私可以看作是遵守策略的一种方式,安全则看做是一种执行策略的方式。隐私问题的核心是符合监管部门的要求、公司策略和客户期望。关于安全还需要考虑的一个因素是与客户签…

多模态大模型 LLaVA 微调教程-大语言模型8

写完之后发现他好像不是很需要这个东西,所以就直接发在自己的博客好了。不投稿首页或者候选区应该本来也就不会有多少流量,所以应该不会干嘛的,大不了后面被说不让放网上以后就删掉这篇,嘻嘻。LLaVA 是最早出现的 Vision Language Model。本教程将教你微调 llava-v1.5-13b …

关押罪犯

S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨…

csapp_实验_-__datalab

Datalab 前言该实验是《深入理解计算机系统》(英文缩写CSAPP)课程附带实验——Lab1:Data Lab,对应书中第二章内容(信息的表示和处理),是所有实验中的第一个实验,**实验目的 ** datalab实验提供了一个文件夹,我们的目的只是改写bits.c中的15个函数,使其完成相应的功能…

PXE高效网络装机与Kickstart无人值守安装

PXE高效网络装机与Kickstart无人值守安装 目录PXE高效网络装机与Kickstart无人值守安装一、PXE概述1、 PXE (Preboot eXcution Environment)的概念2、 PXE批量部署的优点3、部署PXE远程安装服务4、搭建PXE远程安装服务器二、 搭建PXE远程安装服务器的步骤1、安装软件2、配置DHC…

一名合格的程序猿修炼手册

一名合格的程序猿修炼手册📖 😄💯 Github 有个「清华大学计算机系课程攻略」的仓库。💻仓库地址 我看了下清华大学的计算机系课程表,我这里简单列一下跟计算机相关的课程,其实还有很多文化课、图形学、数字电路、高数等等。大一:C/C++语言;大二:Java语言、数据结构…

旧电脑更流畅的操作

(1)任务管理器(2)chkdsk(3)sfc/scannow#####愿你一寸一寸地攻城略地,一点一点地焕然一新#####

手绘与文字的完美结合:阿里的通义万相涂鸦作画体验分享

哈喽,大家好,我是木头左,AI改变生活!一、涂鸦作画简介 涂鸦作画是一款基于人工智能技术的绘画工具,用户可以通过简单的手绘操作,结合文字描述,快速生成具有个性的艺术作品。这款工具的出现,让看到了科技与艺术的完美结合,为的生活带来了无限的想象空间。二、如何使用涂…