#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
unsigned int rgb(unsigned char red, unsigned char green, unsigned blue);
int main(int argc, char **argv)
{
int fd;
/* 打开fb设备 */
fd = open("/dev/fb0", O_RDWR);
if (fd < 0)
{
perror("open fb");
return -1;
}
/* 获取显存信息 */
struct fb_fix_screeninfo fix_info;
struct fb_var_screeninfo var_info;
int line_length;
int ret, x, y;
ret = ioctl(fd, FBIOGET_FSCREENINFO, &fix_info);
if (ret < 0)
{
perror("get fix_info failed");
close(fd);
return ret;
}
line_length = fix_info.line_length;
ret = ioctl(fd, FBIOGET_VSCREENINFO, &var_info);
if (ret < 0)
{
perror("get var_info failed");
close(fd);
return ret;
}
y = var_info.yres;
x = line_length/4;
/* fb设备内存映射 */
unsigned int *fb_addr;
fb_addr = mmap(NULL, y*line_length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (MAP_FAILED == fb_addr)
{
perror("mmap");
close(fd);
return -2;
}
/* 打开bmp图片 */
int bmp_fd = open("./1280.bmp", O_RDONLY);
if (bmp_fd < 0)
{
perror("open bmp");
munmap(fb_addr, y*line_length);
close(fd);
return -3;
}
/* 获取bmp图片信息 */
struct stat bmp_stat;
fstat(bmp_fd, &bmp_stat);
/* bmp图片内存映射 */
unsigned char *bmp_addr;
unsigned char *tmp;
bmp_addr = mmap(NULL, bmp_stat.st_size, PROT_READ, MAP_SHARED, bmp_fd, 0);
if (MAP_FAILED == bmp_addr)
{
perror("mmap bmp");
munmap(fb_addr, y*line_length);
close(fd);
close(bmp_fd);
return -4;
}
tmp = bmp_addr + 54; /* 跳过bmp文件头 */
/* 往显存写数据 */
char r, g, b;
int i, j;
for (i = y-1; i >= 0; i--) /* bmp图片行数据倒叙存放 */
{
for (j = 0; j < x; j++)
{
r = tmp[2];
g = tmp[1];
b = tmp[0];
tmp += 3;
fb_addr[i*x+j] = rgb(r, g, b);
}
}
munmap(fb_addr, y*line_length);
munmap(bmp_addr, bmp_stat.st_size);
close(fd);
close(bmp_fd);
return 0;
}
unsigned int rgb(unsigned char red, unsigned char green, unsigned blue)
{
return (red<<16)|(green<<8)|blue;
}
【C语言】之往显存中刷入一张bmp图片数据
最新推荐文章于 2024-05-10 19:14:42 发布