c语言bmp文件,解析bmp文件(C语言)

/***"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 #include #include #include #include #include #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; }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值