我想写一个函数用来返回一个位图的句柄,,:
HBITMAP GetHBitmap(BITMAPINFO *bmInfo,BYTE* pdata)
{
DWORD dwImageSize= bmInfo->bmiHeader.biWidth * bmInfo->bmiHeader.biHeight * 2;
BITMAPFILEHEADER bfh = {0};
DWORD dwBytesRead = 0;
BOOL bRVal = TRUE;
bfh.bfType = (WORD)'M' << 8 | 'B'; //定义文件类型
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //定义文件头大小
bfh.bfSize = bfh.bfOffBits + dwImageSize; //文件大小 string fname;
GetTempFName(fname); HANDLE hFile = ::CreateFile("E:\\abcd.bmp", GENERIC_WRITE , 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
}
else{
::WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL );
::WriteFile(hFile, bmInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL );
::WriteFile(hFile, pdata, dwImageSize, &dwBytesRead, NULL );
CloseHandle(hFile);
}// HDC hDC=CreateCompatibleDC(NULL);
// HBITMAP hBmp = CreateDIBitmap( hDC,bmiHeader,CBM_INIT,pdata, bmInfo,DIB_RGB_COLORS);
HBITMAP hbmp=(HBITMAP)::LoadImage(NULL,fname.c_str(),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); unlink(fname.c_str());
return hbmp;
}但要是位图的数据是16色的话,无法保存,,,,,
HBITMAP GetHBitmap(BITMAPINFO *bmInfo,BYTE* pdata)
{
DWORD dwImageSize= bmInfo->bmiHeader.biWidth * bmInfo->bmiHeader.biHeight * 2;
BITMAPFILEHEADER bfh = {0};
DWORD dwBytesRead = 0;
BOOL bRVal = TRUE;
bfh.bfType = (WORD)'M' << 8 | 'B'; //定义文件类型
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //定义文件头大小
bfh.bfSize = bfh.bfOffBits + dwImageSize; //文件大小 string fname;
GetTempFName(fname); HANDLE hFile = ::CreateFile("E:\\abcd.bmp", GENERIC_WRITE , 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
}
else{
::WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL );
::WriteFile(hFile, bmInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL );
::WriteFile(hFile, pdata, dwImageSize, &dwBytesRead, NULL );
CloseHandle(hFile);
}// HDC hDC=CreateCompatibleDC(NULL);
// HBITMAP hBmp = CreateDIBitmap( hDC,bmiHeader,CBM_INIT,pdata, bmInfo,DIB_RGB_COLORS);
HBITMAP hbmp=(HBITMAP)::LoadImage(NULL,fname.c_str(),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); unlink(fname.c_str());
return hbmp;
}但要是位图的数据是16色的话,无法保存,,,,,
{
bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // 图像宽度,一般为输出窗口宽度
bmInfo.bmiHeader.biWidth = 768;
bmInfo.bmiHeader.biHeight = 288;
bmInfo.bmiHeader.biBitCount = 16; /*
* 以下设置一般相同,
* 对于低于8位的位图,还应设置相应的位图调色板
*/
bmInfo.bmiHeader.biPlanes = 1;
bmInfo.bmiHeader.biCompression = BI_RGB;
bmInfo.bmiHeader.biSizeImage = 0;
bmInfo.bmiHeader.biXPelsPerMeter = 0;
bmInfo.bmiHeader.biYPelsPerMeter = 0;
bmInfo.bmiHeader.biClrUsed = 0;
bmInfo.bmiHeader.biClrImportant = 0;
}
DWORD dwImageSize= bmInfo->bmiHeader.biWidth * bmInfo->bmiHeader.biHeight * 2;
这里的计算不对吧,没做4字节对齐
http://community.csdn.net/Expert/topic/4942/4942352.xml?temp=.8830835
哪位看看我的问题,谢谢
biPlanes
Specifies the number of planes for the target device. This value must be set to 1.
---------------------------------------------------------------------------------
BITMAPINFOHEADER里的biPlanes要设1,还有您的pdata是不是RGB555的?godfly000()
调色板也要填好
----------------------------------------------------------------------------
楼主把biCompression清0了(BI_RGB),就是表示没做压缩,所以不用写入调色板的数据。