解析bmp文件(C语言)

来源:互联网 发布:淘宝营销思路 编辑:程序博客网 时间:2024/05/16 06:51

/***"picture.h***/

typedef unsigned short u16;

typedef unsigned int u32;
#pragma pack(1)
struct BmpHead {
u16 identifier;
u32 file_size;
u32 reserved;
u32 x;
u32 h_size;
u32 width;
u32 heigth;
u16 planes;
u16 BPP;
u32 compression;
u32 bd_size;
u32 hresolution;
u32 vresolution;
u32 palette_numbers;
u32 important_colors;
};
#pragma pack()

/***"picture.c***/

#include <sys/mman.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include "picture.h"
#define FB_DEV "/dev/fb0"
int main(int argc, char *argv[])
{
int fd_dev;
int ret;
int fd_bmp;
int i, j;
struct fb_var_screeninfo var;
struct fb_fix_screeninfo fix;
struct BmpHead bmp;
__u8 *map, *tmp;
__u8 buff[3];
__u32 width, heigth;
__u32 fix_len;
__u32 bpp;


fd_dev = open(FB_DEV, O_RDWR);
if (fd_dev < 0) {
perror("open");
return fd_dev;
}


ioctl(fd_dev, FBIOGET_VSCREENINFO, &var);
ioctl(fd_dev, FBIOGET_FSCREENINFO, &fix);


width = var.xres_virtual;
heigth = var.yres_virtual;
bpp = (var.bits_per_pixel + 7) / 8;
fix_len = fix.line_length / bpp;


fd_bmp = open(argv[1], O_RDONLY);
if (fd_bmp < 0) {
perror("open");
close(fd_dev);
return fd_bmp;
}


ret = read(fd_bmp, &bmp, sizeof(bmp));


printf("bmphead = %d\nwidth = %d\nheight = %d\nbpp = %d\nfix_len = %d\n",
sizeof(bmp), bmp.width, bmp.heigth, bmp.BPP, fix_len);


map = (__u8 *)mmap(NULL, fix_len * heigth * bpp,
PROT_WRITE, MAP_SHARED, fd_dev, 0);
tmp = map;


for (i = 0; i < heigth; i++) {
lseek(fd_bmp, -1 * ((i + 1) * ((bmp.width * 3 + 3) / 4 * 4)), SEEK_END);


for (j = 0; j < fix_len; j++) {
if (i < bmp.heigth && j < bmp.width) {
read(fd_bmp, buff, 3);


*map = buff[0];
map++;
*map = buff[1];
map++;
*map = buff[2];
map++;
*map = 0;
map++;
}
if (j == bmp.width) {
map = map + (fix_len - bmp.width) * 4;
break;
}
}
}
munmap(tmp, fix_len * heigth * bpp);
close(fd_bmp);
close(fd_dev);
return 0;
}