BMP格式文件主要由位图文件头、位图信息头、位图数据三部分组成,有时候还需考虑调 {MOD}板的使用。本文该出了在利用 相机采集到图像信息的基础之上,将图像数据保存文BMP格式的图片。首先创建两个结构,用于位图文件头和位图信息头数据的保存。typedef unsigned char BYTE;
typedef unsigned short WORD;
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; //实际使用的调 {MOD}板索引数,0:使用所有的调 {MOD}板索引
DWORD biClrImportant;
}BITMAPINFOHEADER;
笔者使用的文件头与信息头的数据:
//Set BITMAPINFOHEADER
bi.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 BITMAPFILEHEADER
bf.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下使用这个功能,欢迎大家加以指正。