BOOL BitBlt (int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop)
BitBlt 是把pSrcDC的数据复制到调用该函数的DC上
int GetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbi, UINT uUsage)
GetDIBits函数获取指定兼容位图的位,然后将其作一个DIB—设备无关位图(Device-Independent Bitmap)使用的指定格式复制到一个缓冲区中
要输出位图,就要用到GetDIBits函数把位图信息读到一个数组中,然后保存数组。
至于位图信息的获取,需要创建一个与原DC兼容的兼容DC,和与原DC兼容的兼容位图(可以是CBitMap),把兼容位图用SelectObject函数选进兼容DC,最后通过GetDIBits函数从兼容DC的位图中输出到数组。
对于兼容DC上位图1:对兼容DC的所有操作都会体现在位图上,也就是说如果在兼容DC上作图,相当于在兼容DC上的位图上作图。
对于兼容DC上位图2:位图数据的来源可以是通过在兼容DC上作图得到的,也可以是从原DC上BitBlt来的
//兼容DC
CDC compatibleDC;
compatibleDC.CreateCompatibleDC(pDC);
//兼容位图
CBitmap bitmapData;
bitmapData.CreateCompatibleBitmap(pDC, colNum, rowNum);
compatibleDC.SelectObject(&bitmapData);
{
//此处可以用兼容DC绘制,体现在兼容位图
compatibleDC.FillSolidRect(0, 0, colNum, rowNum, RGB(255, 255, 255));
CPen pen(PS_SOLID, 10, RGB(255, 0, 0));
CPen *open = compatibleDC.SelectObject(&pen);
compatibleDC.Ellipse(10, 10, 20, 20);
compatibleDC.SelectObject(open);
//或者可以把原DC上的数据复制到兼容DC的兼容位图
compatibleDC.BitBlt(0, 0, colNum, rowNum, pDC, 0, 0, SRCCOPY);
}
//最后把兼容DC兼容位图中复制到数组中
GetDIBits(compatibleDC.m_hDC, (HBITMAP)bitmapData.m_hObject, 0, rowNum, pByte, (LPBITMAPINFO)&bitmapInfoHeader, DIB_RGB_COLORS)
下边就可以组织BITMAPFILEHEADER、BITMAPFILEHEADER对象的设置,准备输出了
在对BMP的文件头、信息头格式设置格式时,可以采用下边方法
BITMAP mbitmap;
bitmapData.GetBitmap(&mbitmap);
bitmapInfoHeader.biWidth = mbitmap.bmWidth;
bitmapInfoHeader.biHeight = mbitmap.bmHeight;
bitmapInfoHeader.biPlanes = mbitmap.bmPlanes;
bitmapInfoHeader.biBitCount = mbitmap.bmBitsPixel;
也可以自己直接赋值指定格式