首页 > 其他分享 >在 LCD 上任意位置显示一张任意大小

在 LCD 上任意位置显示一张任意大小

时间:2024-05-12 19:08:38浏览次数:32  
标签:一张 int bmp headerinfo unsigned LCD BMP 任意

/*************************************************************************************
 *
 *  file name:  1.c
 *  author   : 	lu.ciana.598393@gmail.com
 *  date     :  2024/05/12
 *  function : 	设计程序,实现在 LCD 上任意位置显示一张任意大小
 *  note	 : none
 *  CopyRight (c)   2024    lu.ciana.598393@gmail.com   All Right Reserved
 *
 ************************************************************************************/

#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
  * @brief  	实现在 LCD 上任意位置显示一张任意大小
  * @param
  				@name
				@x1
				@y1
  * @retval 	int
  * @date 		2024/05/12
  * @note   	补充 注意 说明
  */
int ShowBmp(const char *name,int x1,int y1)
{

	//1.打开待显示的BMP图像  fopen
	FILE * bmp_fp = fopen(name,"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*3
	char *bmp_buf= calloc(1,3*(headerinfo.biWidth)*(headerinfo.biHeight));
	fread(bmp_buf,1,3*(headerinfo.biWidth)*(headerinfo.biHeight),bmp_fp);

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

	//5.打开LCD   open  
	int lcd_fd = open("/dev/fb0",O_RDWR);


	//6.对LCD进行内存映射  mmap
	int * 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 <--- 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[])
{
   ShowBmp(argv[1],456,102);
	return 0;
}


标签:一张,int,bmp,headerinfo,unsigned,LCD,BMP,任意
From: https://www.cnblogs.com/lu-ciana/p/18188069

相关文章

  • 在lcd屏幕上的任意位置显示任意大小的图片
    /***************************************************filename:ShowBmp2.c*author:momolyl@126.com*date:2024/05/12*brief:在lcd屏幕上的任意位置显示任意大小的图片*note:None**CopyRight(c)2024momolyl@126.com......
  • 获取lcd设备分辨率 色深
    /********************************************************************* filename: get_dev_info.c* author :lzj* date :2024/05/11* function:获取lcd设备分辨率*色深* note :None** CopyRight(c)2023-2024jjh6lzj@163.comAllRightReseverd......
  • 获取任意bmp图片的参数函数设计
    /**@Author:Eoneon4051@163.com*@Date:2024-05-0814:24:52*@LastEditors:Eoneon4051@163.com*@LastEditTime:2024-05-1118:57:02*@FilePath:\数据结构text\text,.c*@Description:这是默认设置,请设置`customMade`,打开koroFileHeader查看配置进行设......
  • 通过内存映射的方式向lcd屏幕输出几个圆
    /***************************************************filename:color.c*author:momolyl@126.com*date:2024/05/11*brief:通过内存映射的方式向lcd屏幕输出几个圆*note:None**CopyRight(c)2024momolyl@126.comAll......
  • el-cascader设置为任意一级选项,去除单选按钮以及点击关闭下拉选择
    1、标签组件:<el-cascaderref="cascaderRef1"popper-class="popper-cascader"@change="handleChangeCascader(cascaderRef1)"></el-cascader>2、给popper-cascader设置样式,在element-ui,scss里编写.popper-cascader.el-cascader-panel......
  • Copilot - OpenAI与GitHub联合出品的自动代码生成AI+VirtualLCD - 可用于 GUI 移植的
    1、AntOS-适用8051的超轻量级实时操作系统AntOS是一款超轻量级实时操作系统,抢占式调度极简内核,专门为小型家电及轻量型物联网终端设计,适合在8051为内核的MCU上运行。项目主页: https://gitee.com/zeweni/ant-osAntOS提供层级服务,可以进行任意裁剪。内核层包含两个子系......
  • VKL060/076 SSOP24/28 超低功耗LCD液晶段码屏驱动芯片适用水电表/温湿度计,FAE技术支持
    VKL060概述: VKL060是一个点阵式存储映射的LCD驱动器,可支持最大60点(15SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•  工......
  • 调用lcd屏输出德国国旗
    /***************************************************filename:color.c*author:momolyl@126.com*date:2024/05/10*brief:向lcd屏幕输出德国国旗*note:None**CopyRight(c)2024momolyl@126.comAllRightReseverd......
  • 英特尔的一张完美答卷!酷睿Ultra 9 185H性能探秘
    英特尔酷睿Ultra9185H是酷睿Ultra家族中最顶级的型号,它的性能表现如何?今天我们一起来看看。根据CPU-Z信息检索来看,英特尔酷睿Ultra9185H处理器采用了6个性能核,8个能效核再加上2个超低功耗核构成,总计16核22线程,最高睿频可以达到5.1GHz,拥有24MB三级缓存,基础TDP为45W。这颗处理......
  • 1992年,姜万勐 看到 MPEG芯片Epiphany – 用MPEG1 把图像和声音同时存储在一张
    如果我穿越到1993年,发现万燕公司在VCD市场中面临激烈竞争,我会提出一些建议来帮助他们应对挑战并保持竞争力:产品创新与差异化:鉴于竞争对手大量仿制VCD机,我会建议万燕公司通过产品创新和差异化来区别于竞争对手。这可能包括提高VCD机的性能、功能和外观设计,以及增加附加功能如更好......