解决方案 »

  1.   

    你并没有从文件读入BITMAPINFOHEADER,当然创建失败啦。
    另外不太能跟上你读取信息的逻辑。比如:PBMINOW=(BITMAPINFO *)new BYTE[Header.bfOffBits-14];
    Header.bfOffBits-14是什么意思? 如果是24位bitmap, 这个位置指向BITMAPINFOHEADER.biXPelsPerMeter;的一半。
    如果BITMAPINFOHEADER.biCompression == BI_BITFIELDS,16位bitmap的话这个位置指向BITMAPINFOHEADER.biClrImportant一半,32位bitmap的话这个位置指向Alpha mask的一半。 如果是8位bitmap的话这个位置指向调试板倒数颜色中某个的一半。最终结果Header.bfOffBits-14=sizeof(BITMAPFILEHEADER)+part sizeof(BITMAPINFO). 完全无法理解你分配这么一块奇怪大小内存的目的。
      

  2.   

    "G:\\20100000.bmp";已经是 bmp ,转换什么?loadimage    fromfile  createDibs
      

  3.   

    即:
    LR_CREATEDIBSECTION | LR_LOADFROMFILE
      

  4.   

    稍微改动了一下:CFile CFImage;//文件对象
    CString CSPath="G:\\20100000.bmp";
    BITMAPINFO * PBMINOW=NULL;
    BYTE *PBNOW=NULL;
    BITMAPFILEHEADER Header;if(CFImage.Open(CSPath,CFile::modeReadWrite))
    {
        CFImage.Read(&Header,sizeof(BITMAPFILEHEADER));    PBMINOW=(BITMAPINFO *)new BYTE[Header.bfOffBits-sizeof(BITMAPFILEHEADER)];
        CFImage.Read(PBMINOW,Header.bfOffBits-sizeof(BITMAPFILEHEADER));
        CFImage.Seek(Header.bfOffBits,CFile::begin);     int sz = PBMINOW->bmiHeader.biHeight;
        if( sz < 0 ) sz = -sz;    sz *= PBMINOW->bmiHeader.biWdth;
        switch(PBMINOW->bmiHeader.biBitCount)
        {
            case 1: sz = (sz+7)/8; break;
            case 4: sz = (sz+1)/2; break;
            case 16: sz *= 2; break;
            case 24: sz *= 3; break;
            case 32: sz *= 4; break;
        }    sz = (sz+3) & 0xFFFFFFFC;    PBNOW = new BYTE[sz];
        CFImage.Read(sz);
        CFImage.Close();
    }// 进行DIB转换
    HBITMAP HBNOW = CreateDIBitmap(NULL,(BITMAPINFOHEADER*)PBMINOW, CBM_INIT, PBNOW, (BITMAPINFO*)PBMINOW, DIB_RGB_COLORS);