输出位图中BitBlt函数、GetDIBits函数中的使用

来源:互联网 发布:知乎 济南血液病医院 编辑:程序博客网 时间:2024/05/19 19:14

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;

也可以自己直接赋值指定格式

原创粉丝点击