16位RGB565格式图像数据存储为bmp文件
想把下位机传上来的16位RGB565格式图像数据存储为bmp文件,看着网上一些程序改的,不知道哪里写错了,保存后图象显示不对,求指导,谢谢
代码如下:
WORD width = 160;
WORD height = 160;
BITMAPFILEHEADER bmfHdr; //定义文件头
BITMAPINFOHEADER bmiHdr; //定义信息头
RGBQUAD bmiClr[3]; //定义调色板
bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
bmiHdr.biWidth = width;//指定图像的宽度,单位是像素
bmiHdr.biHeight = -height;//指定图像的高度,单位是像素
bmiHdr.biPlanes = 1;//目标设备的级别,必须是1
bmiHdr.biBitCount = 16;//表示用到颜色时用到的位数 16位表示高彩色图
bmiHdr.biCompression = BI_BITFIELDS;//BI_RGB仅有RGB555格式
bmiHdr.biSizeImage = (width * height * 2);//指定实际位图所占字节数
bmiHdr.biXPelsPerMeter = 0;//水平分辨率,用象素/米表示。
bmiHdr.biYPelsPerMeter = 0;//垂直分辨率,用象素/米表示。
bmiHdr.biClrUsed = 0;//位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)
bmiHdr.biClrImportant = 0;//说明对图象显示有重要影响的颜色索引的数目,0表示所有颜色都重要
//RGB565格式掩码
bmiClr[0].rgbBlue = 0;
bmiClr[0].rgbGreen = 0xF8;
bmiClr[0].rgbRed = 0;
bmiClr[0].rgbReserved = 0;
bmiClr[1].rgbBlue = 0xE0;
bmiClr[1].rgbGreen = 0x07;
bmiClr[1].rgbRed = 0;
bmiClr[1].rgbReserved = 0;
bmiClr[2].rgbBlue = 0x1F;
bmiClr[2].rgbGreen = 0;
bmiClr[2].rgbRed = 0;
bmiClr[2].rgbReserved = 0;
bmfHdr.bfType = (WORD)0x4D42;//文件类型,0x4D42也就是字符'BM'
bmfHdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 3 + width * height * 2);//文件大小
bmfHdr.bfReserved1 = 0;//保留,必须为0
bmfHdr.bfReserved2 = 0;//保留,必须为0
bmfHdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * 3);//实际图像数据偏移量
CFile fp;
fp.Open("d:\\Model.bmp", CFile::modeCreate | CFile::modeWrite);
fp.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER)); // 写文件头
fp.Write((LPSTR)&bmiHdr, sizeof(BITMAPINFOHEADER)); // 写信息头
fp.Write((LPSTR)&bmiClr, sizeof(RGBQUAD) * 3);
fp.Write((LPSTR)CameraData, width * height * 2);// 写数据
fp.Close();