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

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

时间:2024-05-13 21:55:43浏览次数:13  
标签:int bmp headerinfo 开发板 LCD BMP 任意 unsigned

文件IO练习题

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

代码:

/*****************************************************************************************************************
*	
*	file name	:	ShowBmp.c
*	author	 	:	[email protected]
*	data  	 	:	2024/05/13
*	function	:	实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,不要越界
*	note	 	  :	None
* 	
*  	CopyRight (c)	2024	[email protected] 	All Right Reseverd
*
* ****************************************************************************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

#pragma pack(1)

// 定义BMP文件头部结构
typedef struct{
	unsigned short bfType;          //标识该文件为bmp文件,判断文件是否为bmp文件,即用该值与"0x4d42"比较是否相等即可,0x4d42 = 19778
	unsigned int   bfSize;          //位图文件大小,包括这14个字节。
	unsigned short bfReserved1;     //预保留位,暂不用。
	unsigned short bfReserved2;     //预保留位,暂不用。
	unsigned int   bfOffBits;       //图像数据区的起始位置
}BITMAPFILEHEADER;                  //文件头

typedef struct{
	unsigned int biSize;            //本结构的长度,为40个字节。
	int biWidth;				    //宽度
	int biHeight;				    //高度
	unsigned short biPlanes;        //目标设备的级别,必须是1。
	unsigned short biBitCount;	    //色深,每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。
	unsigned int biCompression;     //压缩方式,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。
	unsigned int biSizeImage;       //图像区数据大小,即实际的位图数据占用的字节数
	int biXPelsPerMeter;            //水平分辨率,像素每米
	int biYPelsPerMeter;            //垂直分辨率,单位是像素/米
	unsigned int biClrUsed;         //位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂。
	unsigned int biClrImportant;    //位图显示过程,重要的颜色数;0--所有都重要
}BITMAPINFOHEADER;     


#pragma pack()

void ShowBmp(char *name,int x1,int y1,int *lcd_mp)
{
	//1.打开待显示的BMP图像  fopen
	FILE * bmp_fp = fopen(name,"rb");
	if (NULL == bmp_fp)
	{
		return -1;
	}

	//2.读取BMP文件的图像信息,获取BMP的宽和高
	BITMAPINFOHEADER headerinfo;
	BITMAPFILEHEADER headerfile;
	fseek(bmp_fp,sizeof(headerfile),SEEK_SET);
	fread(&headerinfo,1,sizeof(headerinfo),bmp_fp); //读取40字节
	printf("bmp width = %d,height = %d\n",headerinfo.biWidth,headerinfo.biHeight);

	//3.读取BMP图*片的颜色分量  800*480*3
	char *bmp_buf = calloc(1,headerinfo.biWidth*headerinfo.biHeight*(headerinfo.biBitCount/8));
	fread(bmp_buf,1,headerinfo.biWidth*headerinfo.biHeight*(headerinfo.biBitCount/8),bmp_fp);

	//4.关闭BMP
	fclose(bmp_fp);

	//5.打开LCD   open  
	int lcd_fd = open(lcd_mp,O_RDWR);


	//6.对LCD进行内存映射  mmap
	lcd_mp = (int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);

	//7.循环的把BMP图像的颜色分量依次写入到LCD的像素点中 
	int i = 0;
	int data = 0;

	for (int y = y1+headerinfo.biHeight-1; y >= y1; y--)
	{
		for (int x = x1; x < x1+headerinfo.biWidth ; ++x)
		{
			//把BMP图片的一个像素点的颜色分量转换为LCD屏幕的一个像素点的颜色分量格式  ARGB <--- BGR
			data |= bmp_buf[i];			//B
			data |= bmp_buf[i+1]<<8;	//G
			data |= bmp_buf[i+2]<<16;  	//R

			lcd_mp[800 * y + x] = data;  //BGR BGR BGR .... 

			i+=3;  
			data = 0;
		}
	}
	
	//8.关闭LCD
	close(lcd_fd);
	munmap(lcd_mp,800*480*4);
}


int main(int argc, char const *argv[])
{
	int x,y;
	//1.用户输入任意位置的坐标
  	printf("please input your x and y coordinate:");
  	scanf("%d %d",&x,&y);


	ShowBmp(argv[1],x,y,"/dev/fb0");
	return 0;
}

标签:int,bmp,headerinfo,开发板,LCD,BMP,任意,unsigned
From: https://www.cnblogs.com/cwp-home/p/18190114

相关文章

  • 实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展
    /***********************************************************************************************************实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发*板,展示缩放后的bmp文件****Copyright(c)2023-202418975491291......
  • 在LCD上的任意位置显示一张任意大小的jpg图片
    /***************************************************filename:lcdshowjpg.c*author:[email protected]*date:2024/05/13*brief:完成libjpeg库的移植,并设计程序实现在LCD上的任意位置显示一张任意大小的jpg图片,注意不要越界。*note:......
  • 野火指南者STM32F103+STM32CubeMX FSMC实现LCD屏幕显示
    MCU:STM32F103VET6开发环境:STM32CubeMX+MDK5最近针对STM32的LCD进行复习,顺便展开一下笔记。 STM32LCD液晶屏(ILI9341)本文章使用STM32F103VET6,野火指南者的3.2寸电阻屏,进行学习。 LCD液晶显示针对野火指南者配套资料:3.2寸LCD电阻屏,屏幕里自带ILI9341液晶控制器芯片,......
  • 【WCH蓝牙系列芯片】-基于CH582开发板—主机枚举从机所有服务和特征
    -------------------------------------------------------------------------------------------------------------------------------------在使用沁恒的CH582蓝牙芯片的过程中,有时需要主机去连接蓝牙从机进行通信,主机在使用过程中工作流程是: 1、 蓝牙初始化完成后,开始扫描......
  • 将任意bmp图片大小重新设置后生成新的bmp图片
    #include<stdio.h>#include<stdlib.h>#include<string.h>#pragmapack(1)/*必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐*/typedefstructtagBITMAPFILEHEADER{ unsignedshortbfType; //保存图片类型。'BM' unsignedlongbfSize; //位图......
  • LCD屏显示图片习题【一】
    目录LCD屏显示图片习题题目解析代码完整展示LCD屏显示图片习题题目解析​ 该题的显著要求有两个,一是任意位置,二是任意大小。为满足这两个要求得先读取并记录bmp数据,且bmp文件属于普通文件,所以选择标准IO函数fopen()打开bmp,并用结构体变量进行记录;然后为了提升用户使用体验,即b......
  • BMP格式图片缩放及在LCD屏幕展示练习
    /***@brief:实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展示缩放后的bmp文件因为只是进行函数练习,未采用函数封装的做法*@[email protected]*@date2024/05/12*CopyRight(c)2023-2024ni456xinmie@1......
  • 在LCD屏内显示任意尺寸任意大小的bmp图像
    在LCD屏内显示任意尺寸任意大小的bmp图像定义结构体/******************************************************************************filename:ShowBmp.c*author:Dazz*date:2024-05-12*function:在LCD上显示任意大小任意尺寸的bmp图片*note......
  • 获取BMP图片件并在LCD屏上打开
    目录目录获取BMP文件获取信息进行缩放并产生新的BMP文件并在LCD屏上进行显示头文件BMP文件结构体主函数/********************************************************************filename:ChangeBmp.c*author:[email protected]*date:2024-05-12*func......
  • bmp任意大小任意尺寸显示在lcd屏内
    IO编程在LCD屏内显示任意尺寸任意大小的图像/******************************************************************************filename:2024-05-12_ShowBmp.c*author:[email protected]*date:2024-05-12*function:在LCD上显示任意大小任意尺......