bmp图片解码程序——bmp232.c :
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
typedef unsigned int u32;
struct bmp_pixel_t {
unsigned char b;
unsigned char g;
unsigned char r;
};
struct fb_pixel_t {
unsigned char b;
unsigned char g;
unsigned char r;
unsigned char a;
};
int main(int argc, char *argv[])
{
int fd, fb;
char magic[2];
int w, h;
int i, j;
short bpp;
int offset;
struct bmp_pixel_t p;
struct fb_pixel_t *map;
if (argc < 2)
{
fprintf(stderr, "Usage: %s bmpfile\n", argv[0]);
return -1;
}
fd = open(argv[1], O_RDONLY);
read(fd, magic, 2);
if (memcmp(magic, "BM", 2))
{
fprintf(stderr, "unkown format.\n");
return -1;
}
//****************读取头信息****************//
lseek(fd, 10, SEEK_SET);
read(fd, &offset, sizeof(int));
lseek(fd, 18, SEEK_SET);
read(fd, &w, sizeof(int));
read(fd, &h, sizeof(int));
lseek(fd, 28, SEEK_SET);
read(fd, &bpp, sizeof(short));
printf("[%s] %d x %d x %d\n", argv[1], w, h, bpp);
//*******************************************//
struct fb_pixel_t white = { 0xff, 0xff, 0xff, 0xff };
lseek(fd, offset, SEEK_SET);
unsigned short int bmp16;
//**********打开新的文件,进行保存数据*******//
int fdo = open(argv[2], O_TRUNC | O_CREAT | O_RDWR );
if( fdo == -1 ) {
printf("error.\n");
return -1;
}
u32 bmp32;
//********把数据写到新文件,变成一个纯二进制文件***********//
if(bpp != 32)
{
for (i = h-1; i >= 0; --i) //循环读取数据,并保存
{
lseek( fdo, i * w * 4, 0 );
for (j = 0; j < w; ++j)
{
read(fd, &p, sizeof(p));
bmp32 = 0;
bmp32 = p.b;
bmp32 |= p.g << 8;
bmp32 |= ( p.r) << 16;
write( fdo, &bmp32, 4 );
}
}
}
else
{
for (i = h-1; i >= 0; --i)
{
lseek( fdo, i * w * 4, 0 );
for (j = 0; j < w; ++j)
{
read(fd, &bmp32, sizeof(p));
write( fdo, &bmp32, 4 );
}
}
}
close( fdo );
return 0;
}
bmp图片解码程序
最新推荐文章于 2021-05-18 08:43:23 发布