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