读书人

保存为8bitBMP只有黑色部分的有关问题

发布时间: 2013-02-25 10:23:36 作者: rapoo

保存为8bitBMP只有黑色部分的问题
在单文档客户区绘图后,想保存为8位的BMP图像,但是我用下面的代码保存是可以,但是保存的图片里面只有黑色部分的图形,黄色部分的图形却不见了,求各位高手帮帮忙,我看不出哪里错了,谢谢大家。代码如下:
CClientDC SHDC(this);//取得客户区内存DC
CPaintDC dc(this);
CDC memDC;
CRect rect;
GetClientRect(rect);
memDC.CreateCompatibleDC(&SHDC);
CBitmap bm;
int Width=rect.Width();//
int Height=rect.Height();//
bm.CreateCompatibleBitmap(&SHDC, Width, Height);
CBitmap* pOld=memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, Width, Height, &SHDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes * btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR, size);
BITMAPFILEHEADER bfh;
RGBQUAD rgbQuad[256]; //定义调色板

btm.bmBitsPixel=(WORD)8;

BITMAPINFOHEADER bih;
bih.biBitCount=8;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=BI_RGB;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
bfh.bfReserved1=bfh.bfReserved2 = 0;
bfh.bfType=0x4d42;

bfh.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*256+size); //指定文件大小
bfh.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
//从文件头到实际的位图数据的偏移字节数


//对调色板进行赋值
for(int i=0; i<256; i++)
{
rgbQuad[i].rgbBlue=(BYTE)i;
rgbQuad[i].rgbGreen=(BYTE)i;
rgbQuad[i].rgbRed=(BYTE)i;
rgbQuad[i].rgbReserved=0;
}


CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
if (dlg.DoModal()==IDOK)
{
CFile bf;
CString ss=dlg.GetPathName();
if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.Write((LPSTR)rgbQuad,sizeof(RGBQUAD)*256); //写调色板
bf.WriteHuge(lpData, size);
bf.Close();
}
GlobalFreePtr(lpData);
}
[解决办法]
hPal = GetStockObject(DEFAULT_PALETTE);
[解决办法]
要用GetDC()创建兼容性位图
因为memdc是以单色位图进行初始化的,你用memdc创建的兼容性位图自然也是单色的。所以你在单色的兼容性位图上画,当然也只能得到单色的图像了。

读书人网 >VC/MFC

热点推荐