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图像就是正确的了。
在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图像就是正确的了。
相关文章推荐
- 为raw数据添加图像头,并保存为bmp图像
- bmp图像读取显示保存问题
- Android Bitmap保存为.bmp格式,图像转化为黑白图片
- VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
- 解码保存全部BMP图像
- QImage的save函数保存的bmp图像无法打开
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- C++读取、旋转和保存bmp图像文件编程实现
- DM642学习点滴三:将DSP内存中的图像数据保存为BMP图像
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- 利用C的BMP图像的读取、保存及旋转的实现
- Android Bitmap保存为.bmp格式,图像转化为黑白图片
- MFC中,将视图中的内容保存为图像(bmp、jpg)
- 数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)
- 将开发板中显示的图像保存为bmp
- DC保存至BMP图像
- C++读取、旋转和保存bmp图像文件编程实现