IO编程
在LCD屏内显示任意尺寸任意大小的图像
/****************************************************************************
*
* file name: 2024-05-12_ShowBmp.c
* author : [email protected]
* date : 2024-05-12
* function : 在LCD上显示任意大小任意尺寸的bmp图片
* note : None
* CopyRight (c) 2024 [email protected] 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()
/****************************************************************************
*
* function name :ShowBmp
* function : 显示图片
* parameter :
* @name
* @x
* @y
*
* Return results : none
* note : None
* author : [email protected]
* date : 2024-05-12
* version : V1.0
* revision history : None
*
****************************************************************************/
int ShowBmp(const char *name, int x, int y)
{
// 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图片的颜色分量
char *bmp_buf = calloc(3 * (headerinfo.biWidth) * (headerinfo.biHeight), 1);
int offset = (4 - (pic.biWidth * 3) % 4) % 4;
fread(bmp_buf, 1, 3 * (headerinfo.biWidth) * (headerinfo.biHeight), bmp_fp);
fseek(bmp_fp, offset, SEEK_CUR);
// 4.关闭BMP
fclose(bmp_fp);
// 5.打开LCD open
int lcd_fd = open("/dev/fb0", O_RDWR);
if (-1 == bmp_fd)
{
printf("open %s is error\n", argv[1]);
return -1;
}
// 6.对LCD进行内存映射 mmap
int *lcd_mp = (int *)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);
// 7.循环的把BMP图像的颜色分量依次写入到LCD的像素点中
if (headerinfo.biHeight > 480 || headerinfo.biWidth > 800)
{
printf("your bmp'size over!");
}
int i = 0;
int data = 0;
for (int j = y + headerinfo.biHeight - 1; j >= y; j--)
{
for (int k = x; k < headerinfo.biWidth + x; ++k)
{
// 把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 * j + k] = data; // BGR BGR BGR ....
i += 3;
data = 0;
}
}
// 8.关闭LCD
close(lcd_fd);
munmap(lcd_mp, 800 * 480 * 4);
return 0;
}
// 测试
int main(int argc, char const *argv[])
{
ShowBmp(argv[1], 202, 200); // 输入任意位置坐标把图片放在相应位置
return 0;
}
标签:headerinfo,int,屏内,bmp,unsigned,lcd,BMP,include,任意
From: https://www.cnblogs.com/little-mirror/p/18188168