您的位置:首页 > 其它

BGR保存成bmp图像

2016-09-13 16:03 417 查看
BGR和bmp格式的数据一样,只是bmp多了头信息而已。

在windows下,添加#include <windows.h>, #include <afxpriv.h>等头文件,把BITMAPFILEHEADER、BITMAPINFODEADER等信息包含进去。

然后用以下函数给BGR添加一个头信息就可以了:

void BGR2BMP(BYTE *src, int w, int h, const char *path)

{

FILE *fp = fopen( path, "wb");

BITMAPFILEHEADER fileHeader;

fileHeader.bfType = 0x4D42; //bmp file

fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + w * h * 3;

fileHeader.bfReserved1 = 0;

fileHeader.bfReserved2 = 0;

fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER); + sizeof(BITMAPINFOHEADER);

fwrite(&fileHeader, sizeof(BYTE), sizeof(BITMAPFILEHEADER), fp);

BITMAPINFOHEADER infoHeader;

infoHeader.biBitCount = 24;

infoHeader.biClrImportant = 0;

infoHeader.biClrUsed = 0;

infoHeader.biCompression = 0;

infoHeader.biHeight = h;

infoHeader.biWidth = w;

infoHeader.biPlanes = 1;

infoHeader.biSize = sizeof(BITMAPINFOHEADER);

infoHeader.biSizeImage = w * h * 3;

infoHeader.biXPelsPerMeter = 0;

infoHeader.biYPelsPerMeter = 0;

fwrite(&infoHeader, sizeof(BYTE), sizeof(BITMAPINFOHEADER), fp);

fwrite(src, 1, w*h*3, fp);

fclose(fp);

}

在linux下就比较麻烦,linux下没有相关的头文件定义BITMAPFILEHEADER和BITMAPINFODEADER,所以需要自己写个结构体:

#pragma pack(1)

typedef struct BITMAPFILEHEADER

{

u_int16_t bfType;

u_int32_t bfSize;

u_int16_t bfReserved1;

u_int16_t bfReserved2;

u_int32_t bfOffBits;

}BITMAPFILEHEADER;

typedef struct BITMAPINFOHEADER

{

u_int32_t biSize;

u_int32_t biWidth;

u_int32_t biHeight;

u_int16_t biPlanes;

u_int16_t biBitCount;

u_int32_t biCompression;

u_int32_t biSizeImage;

u_int32_t biXPelsPerMeter;

u_int32_t biYPelsPerMeter;

u_int32_t biClrUsed;

u_int32_t biClrImportant;

}BITMAPINFODEADER;

#pragma pack()

linux下有些编译器默认4字节对齐,这样的话sizeof(BITMAPFILEHEADER)在linux下就会等于16,而windows下为14,所以linux下保存的bmp图像是错误的,因此需要加#pragma pack(1)让它按1字节对齐,这样保存的bmp图像就是正确的了。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: