创建位图失败,高手请进。非常感谢!
创建位图的函数,没有成功,请高手帮忙看看,分析哪里错了。非常感谢!
其中cx,cy为位图高度,ibitcount为位深度,lpData为图像数据,bSave为是否保存标志。
HBITMAP CreatBMP(long cx, long cy, UINT ibitcount, LPBYTE lpData, bool bSave)
{
// 宽度为 4 的整数倍
cx = ((cx+3)/4 * 4);
ASSERT((ibitcount == 1) || (ibitcount == 4) ||
(ibitcount == 8) || (ibitcount == 16)
|| (ibitcount == 24) ||(ibitcount == 32));
int iSize = sizeof(BITMAPINFOHEADER);
switch(ibitcount){
case 8:
iSize += 4*4;
break;
case 1:
case 4:
case 16:
case 24:
case 32:
break;
default:
break;
}
// 创建信息头
BITMAPINFO* pBmpInfo;
BYTE *pByte;
pByte = new BYTE[iSize];
pBmpInfo = (BITMAPINFO*) pByte;
memset(pBmpInfo, 0, iSize);
pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBmpInfo->bmiHeader.biWidth = cx;
pBmpInfo->bmiHeader.biHeight = cy;
pBmpInfo->bmiHeader.biPlanes = 1;
pBmpInfo->bmiHeader.biBitCount = ibitcount;
pBmpInfo->bmiHeader.biCompression = BI_RGB;
pBmpInfo->bmiHeader.biSizeImage = 0;
pBmpInfo->bmiHeader.biClrUsed = 0;
// 创建DIB
CDC *pDC = new CDC;
pDC->CreateCompatibleDC(NULL);
LPVOID lpBits;
HBITMAP hDIB = ::CreateDIBSection(pDC->GetSafeHdc(),
pBmpInfo,
DIB_RGB_COLORS,
&lpBits,
NULL,
0);
// 填充图像数据
LONG lineBytes = cx * ibitcount*8;
memcpy(lpBits, (void* )lpData, lineBytes*cy);
// 是否保存
if( bSave )
{
int iBmpBytes = cx * cy * ibitcount/8;
BITMAPFILEHEADER fileHeader;
ZeroMemory(&fileHeader, sizeof(BITMAPFILEHEADER));
*((char* )&fileHeader.bfType) = 'B';
*(((char*)&fileHeader.bfType) + 1) = 'M';
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) + ibitcount*sizeof(RGBTRIPLE);
fileHeader.bfSize = fileHeader.bfOffBits + iBmpBytes;
CFile file;
if(file.Open("temp.bmp", CFile::modeWrite | CFile::modeCreate))
{
file.Write(&fileHeader, sizeof(BITMAPFILEHEADER));
file.Write(&(pBmpInfo->bmiHeader), sizeof(BITMAPINFOHEADER));
file.WriteHuge(lpBits, iBmpBytes);
file.Close();
}
}
delete pDC;
delete pBmpInfo;
delete pByte;
return hDIB;
}
一执行就s了啊。