bool Write555BitImg2BmpFile(u8 *pImg, int width, int height, const char * filename)
{
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef long LONG;
#pragma pack (push ,1) //把原来对齐方式设置压栈,并设新的对齐方式
typedef struct _tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
#pragma pack (pop) //恢复对齐状态
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
long biWidth;
long biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
FILE *BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
WORD *pCur = (WORD *)pImg;
u8 bgr[3];
// Open File
if ((BinFile = fopen(filename, "w+b")) == NULL)
{
printf("Error to open %s\n",filename);
return false;
}
// Fill the FileHeader
FileHeader.bfType = 0x4d42;//((WORD)('M' << 8) | 'B');
FileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //14 + 40 = 54
FileHeader.bfSize = FileHeader.bfOffBits + width*height * 3L;
FileHeader.bfReserved1 = 0;
FileHeader.bfReserved2 = 0;
if (fwrite((void*)&FileHeader, 1, sizeof(BITMAPFILEHEADER), BinFile) != sizeof(BITMAPFILEHEADER))
{
printf("Error to fwrite BITMAPFILEHEADER \r\n");
fclose(BinFile);
return false;
}
// Fill the ImgHeader
BmpHeader.biSize = sizeof(BITMAPINFOHEADER);
BmpHeader.biWidth = width;
BmpHeader.biHeight = -height;//当RGB数据是从位图最后一个点开始扫描,直接写入得到的图片是倒着的,这时用-height,这样图片就正了
BmpHeader.biPlanes = 1;
BmpHeader.biBitCount = 24;
BmpHeader.biCompression = 0;
BmpHeader.biSizeImage = width*height * 3L;
BmpHeader.biXPelsPerMeter = 0;
BmpHeader.biYPelsPerMeter = 0;
BmpHeader.biClrUsed = 0;
BmpHeader.biClrImportant = 0;
if (fwrite((void*)&BmpHeader, 1, sizeof(BITMAPINFOHEADER), BinFile) != sizeof(BITMAPINFOHEADER))
{
printf("Error to fwrite BITMAPINFOHEADER \r\n");
fclose(BinFile);
return false;
}
for (int i = 0; i < width * height; i++)
{
bgr[0] = ((*pCur) & 0x1F) << 3; //B
bgr[1] = ((*pCur) & (0x1F << 5)) >> 2; //G
bgr[2] = ((*pCur) & (0x1F << 10)) >> 7; //R
pCur++;
fwrite((void *)&bgr, 1, 3, BinFile);
}
fclose(BinFile);
return true;
}