首页 > 其他分享 >在lcd屏幕上的任意位置显示任意大小的图片

在lcd屏幕上的任意位置显示任意大小的图片

时间:2024-05-12 18:41:59浏览次数:33  
标签:int pic bmp unsigned lcd BMP 屏幕 任意 biWidth

/*************************************************
 *
 *   file name:ShowBmp2.c
 *   author   :momolyl@126.com
 *   date     :2024/05/12
 *   brief    :在lcd屏幕上的任意位置显示任意大小的图片
 *   note     :None
 *
 *   CopyRight (c) 2024    momolyl@126.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()

int main(int argc, char const *argv[])
{
	// 1.打开待显示的BMP图像  fopen
	FILE *bmp_fp = fopen(argv[1], "rb");
	if (NULL == bmp_fp)
	{
		return -1;
	}

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

	// 3.读取BMP图片的颜色分量  pic.biWidth*pic.biHeight*3

	char *bmp_buf = (char *)calloc(pic.biWidth * pic.biHeight * 3, 1);
	int offset = (4 - (pic.biWidth * 3) % 4) % 4;
	for (int i = 0; i < pic.biHeight; i++)
	{
		fread(bmp_buf + i * pic.biWidth * 3, 1, pic.biWidth * 3, bmp_fp);
		fseek(bmp_fp, offset, SEEK_CUR);
	}

	// 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, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);

	// 7.循环的把BMP图像的颜色分量依次写入到LCD的像素点中
	int i = 0;
	int data = 0;
	int X = 0, Y = 0;
	printf("please input the picture's site:");
	scanf("%d,%d", &X, &Y);
	for (int y = Y + pic.biHeight - 1; y >= Y; y--)
	{
		for (int x = X; x < X + pic.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);

	return 0;
}

标签:int,pic,bmp,unsigned,lcd,BMP,屏幕,任意,biWidth
From: https://www.cnblogs.com/bell-c/p/18188047

相关文章

  • 获取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......
  • 网页根据屏幕宽度请求不同的CSS文件
    网页根据屏幕宽度请求不同的CSS文件前言:重在记录,可能出错。一、代码<!DOCTYPEhtml><htmllang="ch"> <head> <title>网页根据屏幕宽度请求不同的CSS文件</title> <linkid="desktop-style"media="onlyscreenand(min-width:960px)"type=&......
  • (VKL系列)超低功耗LCD液晶显示驱动IC-VKL76 SSOP28,19*4 76点阵,超低工作电流约7.5微安,
    VKL076概述:VKL076是一个点阵式存储映射的LCD驱动器,可支持最大76点(19SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•  工......
  • toapi:抓取任意网页内容并提供 HTTP API获取数据
    Github地址:https://github.com/elliotgao2/toapiPythonToapi是一个基于XPath和CSS选择器的WebAPI框架,它能够快速将网页内容转换为结构化的API。Toapi提供了简单易用的接口,使得开发者可以轻松地从网页中提取数据,并以API的形式呈现出来。同时,Toapi支持自定义规则和过......