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

2019-07-13 06:58发布

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下使用这个功能,欢迎大家加以指正。