我用File::read()函数获取位图文件的信息,调用CreateDIBitmap()创建位图,为什么显示的图片只有黑白两色??代码如下,希望各位帮帮忙看看什么事?bool CpshopView::LoadBmpFile(CString BmpFileName)
{
CFile hf;
CFileException e;
LPBITMAPINFOHEADER lpImgData;
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
CPaintDC dc(this);
DWORD ImgSize;
DWORD LineBytes;
DWORD i;
DWORD NumColors;
if(!hf.Open(BmpFileName,CFile::modeRead,&e))
{
MessageBox("File c\\not find!","error message",MB_OK);
return false;
}
hf.Read(&bf,sizeof(BITMAPFILEHEADER));
hf.Seek(14,CFile::begin);
hf.Read(&bi,sizeof(BITMAPINFOHEADER));
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
ImgSize=(DWORD)LineBytes*bi.biHeight;
if(bi.biClrUsed!=0)
NumColors=(DWORD)bi.biClrUsed;
else
switch(bi.biBitCount)
{
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
default:
MessageBox("error","error",MB_OK);
return false;
}
if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)))
{
MessageBox("biterror","biterror",MB_OK);
hf.Close();
return false;
}
bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox("MEMerror","MEMerror",MB_OK);
hf.Close();
return false;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
hf.Seek(14,CFile::begin);
hf.Read(lpImgData,(long)sizeof(BITMAPINFOHEADER)+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
hf.Close();
if(NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));
pPal=(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries=NumColors;
pPal->palVersion=0x300;
lpRGB=(LPRGBQUAD)((LPSTR)lpImgData+(DWORD)sizeof(BITMAPINFOHEADER));
for(i=0;i<NumColors;i++)
{
pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;
pPal->palPalEntry[i].peRed=lpRGB->rgbRed;
pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;
pPal->palPalEntry[i].peFlags=(BYTE)0;
lpRGB++;
}
hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=::CreateCompatibleDC(dc.m_hDC);
if(hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,false);
dc.RealizePalette();
}
hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
if(hPalette&&hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,false);
dc.RealizePalette();
}
//ReleaseDC(hDc);
GlobalUnlock(hImgData);
return TRUE;
}
{
CFile hf;
CFileException e;
LPBITMAPINFOHEADER lpImgData;
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
CPaintDC dc(this);
DWORD ImgSize;
DWORD LineBytes;
DWORD i;
DWORD NumColors;
if(!hf.Open(BmpFileName,CFile::modeRead,&e))
{
MessageBox("File c\\not find!","error message",MB_OK);
return false;
}
hf.Read(&bf,sizeof(BITMAPFILEHEADER));
hf.Seek(14,CFile::begin);
hf.Read(&bi,sizeof(BITMAPINFOHEADER));
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
ImgSize=(DWORD)LineBytes*bi.biHeight;
if(bi.biClrUsed!=0)
NumColors=(DWORD)bi.biClrUsed;
else
switch(bi.biBitCount)
{
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
default:
MessageBox("error","error",MB_OK);
return false;
}
if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)))
{
MessageBox("biterror","biterror",MB_OK);
hf.Close();
return false;
}
bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox("MEMerror","MEMerror",MB_OK);
hf.Close();
return false;
}
lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
hf.Seek(14,CFile::begin);
hf.Read(lpImgData,(long)sizeof(BITMAPINFOHEADER)+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
hf.Close();
if(NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));
pPal=(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries=NumColors;
pPal->palVersion=0x300;
lpRGB=(LPRGBQUAD)((LPSTR)lpImgData+(DWORD)sizeof(BITMAPINFOHEADER));
for(i=0;i<NumColors;i++)
{
pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;
pPal->palPalEntry[i].peRed=lpRGB->rgbRed;
pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;
pPal->palPalEntry[i].peFlags=(BYTE)0;
lpRGB++;
}
hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=::CreateCompatibleDC(dc.m_hDC);
if(hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,false);
dc.RealizePalette();
}
hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
if(hPalette&&hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,false);
dc.RealizePalette();
}
//ReleaseDC(hDc);
GlobalUnlock(hImgData);
return TRUE;
}
HDC hdc, // handle to device context
CONST BITMAPINFOHEADER *lpbmih, // pointer to bitmap size and
// format data
DWORD fdwInit, // initialization flag
CONST VOID *lpbInit, // pointer to initialization data
CONST BITMAPINFO *lpbmi, // pointer to bitmap color-format data
UINT fuUsage // color-data usage
);
你的参数是否正确?
hBitmap=CreateDIBitmap(dc.m_hDC,(LPBITMAPINFOHEADER)lpImgData,(LONG)CBM_INIT,(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
hDc改為dc.m_hDC.對不對?
没时间看你的代码。赫赫