先分配一块内存,大小为你的数组大小的三倍加上54个字节,前14个字节是位图头,查阅BITMAPFILEHEADER,接下来40个字节是信息头,查阅BITMAPINFOHEADER,然后就是你的数据了,放的格式是每三个字节放一个像素的RGB值,全彩色图不需要调色板。
LONG lSize =935*1015*3 + sizeof(BITMAPINFOHEADER )+ sizeof(BITMAPFILEHEADER) ;
m_hGraphDIB = (HDIB)::GlobalAlloc(GHND,lSize);
m_lpGraph = (LPSTR) ::GlobalLock((HGLOBAL)m_hGraphDIB);
LPBITMAPINFOHEADER lpmi = (LPBITMAPINFOHEADER)m_lpGraph;
lpmi->biSize = 40;
lpmi->biWidth = 935;
lpmi->biHeight = 1015;
lpmi->biPlanes = 1;
lpmi->biClrUsed = 0;
lpmi->biClrImportant = 0 ;
lpmi->biCompression = BI_RGB ;
lpmi->biSizeImage = 935*1015 ;
lpmi->biBitCount = 24;
然后用SetDIBitsToDevice()函数显示图像
源代码
BITMAPFILEHEADER bmHdr;
BITMAPINFOHEADER bmInfo;
HANDLE hFile, hNewFile;
DWORD dwByteWritten = 0;
CString str;
CBitmap bitmap;
CDC *pDC = GetDC();
//打开源文件句柄
hFile = CreateFile("test.bmp",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
return ;
//读取原文件bmp头和文件
ReadFile(hFile, &bmHdr, sizeof(bmHdr), &dwByteWritten, NULL);
ReadFile(hFile, &bmInfo, sizeof(bmInfo), &dwByteWritten, NULL);
DWORD dwOldSize = bmInfo.biSizeImage;
if(dwOldSize == 0)
{
dwOldSize = bmHdr.bfSize - sizeof(bmHdr) - sizeof(bmInfo);
}
unsigned char *pBuffer = NULL;
pBuffer = new unsigned char[dwOldSize];
if(pBuffer == NULL)
{
CloseHandle(hFile);
return ;
}
ReadFile(hFile, pBuffer, dwOldSize, &dwByteWritten, NULL);
//
HDC hDC = ::GetDC(m_hWnd);
SetDIBitsToDevice(hDC, 0, 0, bmInfo.biWidth, bmInfo.biHeight, 0, 0, 0, bmInfo.biHeight -1, pBuffer, (BITMAPINFO*)&bmInfo, DIB_RGB_COLORS);
str.Format("%d", dwOldSize);
AfxMessageBox(str);
delete []pBuffer;
CloseHandle(hFile);