Linux下BMP格式文件的保存问题

来源:互联网 发布:广州淘宝代运营诈骗 编辑:程序博客网 时间:2024/05/29 12:58
BMP格式文件主要由位图文件头、位图信息头、位图数据三部分组成,有时候还需考虑调色板的使用。本文该出了在利用 相机采集到图像信息的基础之上,将图像数据保存文BMP格式的图片。

首先创建两个结构,用于位图文件头和位图信息头数据的保存。

typedef unsigned char  BYTE;typedef unsigned shortWORD;typedef unsigned long  DWORD;typedef struct tagBITMAPFILEHEADER{     WORD     bfType;        //Linux此值为固定值,0x4d42           DWORD    bfSize;        //BMP文件的大小,包含三部分             DWORD    bfReserved;    //置0           DWORD    bfOffBits;     //文件起始位置到图像像素数据的字节偏移量        }BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{     DWORD    biSize;          //文件信息头的大小,40          DWORD    biWidth;         //图像宽度       DWORD    biHeight;        //图像高度        WORD     biPlanes;        //BMP存储RGB数据,总为1        WORD     biBitCount;      //图像像素位数,笔者RGB位数使用24          DWORD    biCompression;   //压缩 0:不压缩  1:RLE8 2:RLE4         DWORD    biSizeImage;     //4字节对齐的图像数据大小       DWORD    biXPelsPerMeter; //水平分辨率  像素/米     DWORD    biYPelsPerMeter;  //垂直分辨率  像素/米     DWORD    biClrUsed;        //实际使用的调色板索引数,0:使用所有的调色板索引           DWORD    biClrImportant;        }BITMAPINFOHEADER;

笔者使用的文件头与信息头的数据:

//Set BITMAPINFOHEADERbi.biSize = 40;bi.biWidth = IMAGEWIDTH;bi.biHeight = IMAGEHEIGHT;bi.biPlanes = 1;bi.biBitCount = 24;bi.biCompression = 0;bi.biSizeImage = IMAGEWIDTH*IMAGEHEIGHT*3;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;//Set BITMAPFILEHEADERbf.bfType = 0x4d42;bf.bfSize = 54 + bi.biSizeImage;bf.bfReserved = 0;bf.bfOffBits = 54;


写入文件的顺序:

fwrite(&bf,14,1,fp);                      //写入文件头fwrite(&bi,40,1,fp);                      //写入信息头fwrite(frame_buffer,bi.biSizeImage,1,fp); //写入图像数据

在Linux下实际使用中,数据写入后只得到一副纯黑的图片,考虑之后觉得应该是图片数据并未写入,发现是Linux下字节对齐问题,在代码中添加如下一行即可。

#pragma pack(1)

由于是第一次在Linux下使用这个功能,欢迎大家加以指正。

原创粉丝点击