GetDIBits出来的内存组织方式不同?
时间:2011-11-28
来源:互联网
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,然后进入一个HDC hDcObj准备显示
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);
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,然后进入一个HDC hDcObj准备显示
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);
作者: mengfeihong 发布时间: 2011-11-28
代码如上,感叹号处就是问题,从GetDIBits出来的图片数据,在pBmpMem里是3个字节存放RGB值,紧接着是下个相素的3个字节RGB值,而在pBmpBK里相邻两个相素虽然也是3个字节存放RGB值,但中间却有隔着一个不知道怎么回事的1字节.
作者: mengfeihong 发布时间: 2011-11-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28