回 帖 发 新 帖 刷新版面

主题:256色bmp位图保存的问题

截取客户区的图形,保存为bmp位图,但是这样的方式默认为真彩色,想直接保存为256色的位图呢,直接修改biBitCount参数不行,那该怎么办呢?   
CClientDC dc(this);
CDC memDC;
CRect rect;
GetClientRect(rect);

memDC.CreateCompatibleDC(&dc);
CBitmap bm;
int Width = rect.Width();
int Height = rect.Height();
bm.CreateCompatibleBitmap(&dc, Width, Height);
CBitmap*  pOld = memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, Width, Height, &dc, 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;
BITMAPINFOHEADER bih;
bih.biBitCount = btm.bmBitsPixel;
bih.biClrImportant = 0;
bih.biClrUsed = 0;
bih.biCompression = 0;
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 = ((WORD)('M' < < 8) &#166;'B');
bfh.bfSize = 54 + size;
bfh.bfOffBits = 54;

CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY &#166; OFN_OVERWRITEPROMPT,_T("*.bmp &#166;*.bmp &#166;*.* &#166;*.* &#166;"));
if (dlg.DoModal()!=IDOK)
return;

回复列表 (共1个回复)

沙发

BMP位图格式,分为32位,24位,16位和256色.其中16位又分为565和555格式,256色又分为调色板,RLE压缩,RLE压缩又可以分成很多种.建议你,去网上找一篇BMP格式的详细资料,好好研究一下,然后自己写个保存BMP的函数了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册