读书人

GetDIBits出来的内存组织方式不同?该怎

发布时间: 2012-01-10 21:26:50 作者: rapoo

GetDIBits出来的内存组织方式不同?
HDC hRBkDc = GetDC(m_window); //为了获取当前窗口的背景,也就是游戏背景
HDC hBkDc = CreateCompatibleDC(hDc); //为了把当前窗口背景的内容联系到一个HBITMAP:
//用hBkDc选入一个HBITMAP即bCurBk进来,然后hBkDc作为目的,
//从hRBkDc BitBlt背景内容进来,bCurBk的内容就为当前背景
HBITMAP bCurBk = CreateCompatibleBitmap(hRBkDc, WINWIDTH, WINHEIGHT);//WINWIDTH为窗宽
HBITMAP hBkOldBmp =(HBITMAP)SelectObject(hBkDc,bCurBk); //保存原HBITMAP,这是一般流程
BitBlt(hBkDc,0,0,WINWIDTH,WINHEIGHT,hRBkDc,0,0,SRCCOPY); //从hRBkDc BitBlt背景内容到hBkDc

//获取bCurBk的尺寸,主要是bmWidthBytes
BITMAP bmpBK;
GetObject(bCurBk,sizeof(BITMAP),&bmpBK);
pBmpBK = new unsigned char [bmpBK.bmHeight * bmpBK.bmWidthBytes];

//从bCurBk内获取内容到pBmpBK,用于后面对背景数据的运算
BITMAPINFO bminfo1 = {0};
bminfo1.bmiHeader.biSize = sizeof(bminfo1.bmiHeader);
GetDIBits(hDc,bCurBk,0,bmpBK.bmHeight,NULL,&bminfo1,DIB_RGB_COLORS);
GetDIBits(hDc,bCurBk,0,bmpBK.bmHeight,pBmpBK,&bminfo1,DIB_RGB_COLORS);

//获取前景图片,就是游戏角色的图片
BITMAP bitmap;
GetObject((*ihb)->m_CurBmp,sizeof(BITMAP),&bitmap); //(*ihb)->m_CurBmp为游戏角色图片的HBITMAP
hFinal = CreateCompatibleBitmap (hDc,bitmap.bmWidth,bitmap.bmHeight) ; //为了不改动愿角色图片,故生成此HBITMAP
BITMAPINFO bminfo = {0};
bminfo.bmiHeader.biSize = sizeof(bminfo.bmiHeader);

//获取游戏角色图片内容到pBmpMem
GetDIBits(hDc,(*ihb)->m_CurBmp,0,bitmap.bmHeight,NULL,&bminfo,DIB_RGB_COLORS);
pBmpMem = new unsigned char [bminfo.bmiHeader.biSizeImage];
int lineScaned = GetDIBits(hDc,(*ihb)->m_CurBmp,0,bitmap.bmHeight,pBmpMem,&bminfo,DIB_RGB_COLORS);
DWORD dwL = GetLastError();

int mx = 0,my = 0;
for (my = 0; my < bitmap.bmHeight; my++)
{
for (mx = 0; mx < bitmap.bmWidthBytes/(bitmap.bmBitsPixel/8);mx++)
{
int iRGB = my * ((bitmap.bmWidth * 3 + 1)/2) * 2 + mx*3;

int iRGBBK = my * bmpBK.bmWidthBytes + mx * 4; //注意:这里是4图片比例才正常,为3则横向放大!!!

//为了实验,现在先把部分背景作为角色图片
pBmpMem[iRGB] = pBmpBK[iRGBBK];
pBmpMem[iRGB+1] = pBmpBK[iRGBBK+1];
pBmpMem[iRGB+2] = pBmpBK[iRGBBK+2];
}
}

//处理后,也就是把背景图片的一部分做为角色图片后,把角色图片内容关联到hFinal,然后进入一个HDChDcObj准备显示
SetDIBits(hDc,hFinal,0,bitmap.bmHeight,pBmpMem,&bminfo,DIB_RGB_COLORS);
hOldBmp = (HBITMAP)SelectObject(hDcObj,hFinal);

//GDI善后流程
SelectObject(hBkDc,hBkOldBmp);
DeleteObject(bCurBk);
DeleteDC(hBkDc);
ReleaseDC(m_window,hRBkDc);

//把hFinal显示出来
BitBlt(hDcBuffer,(*ihb)->m_lefttop.x - pMainRole->m_lefttop.x + WINWIDTH/2 - pMainRole->m_iWidth/2,
(*ihb)->m_lefttop.y - pMainRole->m_lefttop.y + WINHEIGHT/2 - pMainRole->m_iHeight/2,
(*ihb)->m_iWidth,(*ihb)->m_iHeight,hDcObj,
0,0,SRCCOPY);

[解决办法]
GetDIBits 用到了 BITMAPINFO, 如果一个图片是 24位的应该 *3
如果是32位的就应该 *4 , 具体的可以调试看 BITMAPINFO 里面的信息
[解决办法]
建议你认真地看看BITMAPINFO结构体说明

读书人网 >VC/MFC

热点推荐