我想写一个函数用来返回一个位图的句柄,,:
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色的话,无法保存,,,,,

解决方案 »

  1.   

    可是写下来的文件没法读,,,,,打开看不到原来的图像,HBITMAP hbmp也返回0,高手帮我看看,函数哪有不对的地方?
      

  2.   

    作为参数传进来的BITMAPINFO *bmInfo是16位的么
      

  3.   

    对,,BITMAPINFO *bmInfo,也是十六位的,,,:void CDH_CG300::FillBmpinfo(BITMAPINFO &bmInfo)
    {




    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;
    }
      

  4.   

    就看了一行
    DWORD dwImageSize= bmInfo->bmiHeader.biWidth  * bmInfo->bmiHeader.biHeight * 2;
    这里的计算不对吧,没做4字节对齐
      

  5.   

    check wiretfile返回的dwBytesRead,是不是都写进去了
      

  6.   

    我也关注,我是8位的,现在都打开不了
    http://community.csdn.net/Expert/topic/4942/4942352.xml?temp=.8830835
    哪位看看我的问题,谢谢
      

  7.   

    这种事情只要认真的读文档就可以了。MSDN中非常清楚。加上一个PhotoShop测试绝对可以做出来的。
      

  8.   

    BITMAPINFOHEADER:(SDK)
    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),就是表示没做压缩,所以不用写入调色板的数据。