19,469
社区成员
发帖
与我相关
我的任务
分享
CFile file;
BITMAPFILEHEADER FILE_HEADER; //文件头
BITMAPINFOHEADER INFO_HEADER; //信息头
file.Open(_T("D:\\256.bmp"),CFile::modeRead); //任意一个256色位图
file.Read(&FILE_HEADER, sizeof(BITMAPFILEHEADER));
if(FILE_HEADER.bfType != 0x4d42)
{
file.Close();
AfxMessageBox(_T("原图象不为BMP图象!"));
return;
}
file.Read(&INFO_HEADER,sizeof(BITMAPINFOHEADER));
int numQuad = 0;
if(INFO_HEADER.biBitCount < 24)
{
numQuad = 1 << INFO_HEADER.biBitCount; //1右移?位 = 2的?次方
}
BITMAPINFO *pBMP_INFO = (BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,
sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD));
memcpy(pBMP_INFO, &INFO_HEADER, sizeof(BITMAPINFOHEADER));
RGBQUAD *quad = (RGBQUAD*)((BYTE*)pBMP_INFO + sizeof(BITMAPINFOHEADER));
if(numQuad != 0)
{
file.Read(quad, sizeof(RGBQUAD) * numQuad);
}
int sizeBuf = FILE_HEADER.bfSize - FILE_HEADER.bfOffBits;
BYTE *bmpBuf = new BYTE[sizeBuf];
file.Read(bmpBuf, sizeBuf);
file.Close();
CDC *pDC = GetDC();
Graphics gdiDC(pDC->GetSafeHdc());
Bitmap *pBmp = Bitmap::FromBITMAPINFO(pBMP_INFO, bmpBuf);//GDI+从BITMAPINFO生成bmp的方法
gdiDC.DrawImage(pBmp, 0, 0);
ReleaseDC(pDC);