首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

10秒钟后灰度效果消失。尼玛闯鬼了,哪位高手能解释一上

2012-10-16 
10秒钟后灰度效果消失。。尼玛闯鬼了,谁能解释一下效果是把缓存dc传入blend进行灰度处理再用bitblt到显示dc

10秒钟后灰度效果消失。。尼玛闯鬼了,谁能解释一下
效果是把缓存dc传入blend进行灰度处理再用bitblt到显示dc显示出来,整个显示函数在wm_timer中执行前10秒(每秒30帧)显示为灰度图,10秒钟后变为原色。
void blend(HDC hDC)

  BITMAPINFO bmpInfo;
  HBITMAP tmpBit=CreateCompatibleBitmap(hDC,600,400);
  HBITMAP hBitmap=(HBITMAP)SelectObject(hDC,tmpBit); // 把当前dc图像选出到hbitmap
  BYTE* pByte=(BYTE*)malloc(600*400*3);
  memset(&bmpInfo, 0, sizeof(bmpInfo));
  bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmpInfo.bmiHeader.biWidth = 600;
  bmpInfo.bmiHeader.biHeight = 400;
  bmpInfo.bmiHeader.biPlanes = 1;
  bmpInfo.bmiHeader.biCompression = BI_RGB;
  bmpInfo.bmiHeader.biBitCount = 24;
  GetDIBits(hDC,hBitmap,0,400,pByte,&bmpInfo,DIB_RGB_COLORS);//通过hbitmap得到dc的像素数组pbyte
  int widthDC=bmpInfo.bmiHeader.biWidth;
int heightDC=bmpInfo.bmiHeader.biHeight;
//-----------------------修改hbitmap为灰度图---------------------------------------
for(int i=0;i<heightDC;i++)
for(int j=0;j<widthDC;j++)
{
 int arv=(pByte[600*3*(400-i-1)+j*3+2]+pByte[600*3*(400-i-1)+j*3+1]+pByte[600*3*(400-i-1)+j*3])/3;
 pByte[600*3*(400-i-1)+j*3+2]=arv; //r
 pByte[600*3*(400-i-1)+j*3+1]=arv; //g
 pByte[600*3*(400-i-1)+j*3]=arv; //b
}
  SetDIBits(hDC,hBitmap,0,heightDC,pByte,&bmpInfo,DIB_RGB_COLORS);

  SelectObject(hDC,hBitmap); //选回dc
  
 
  delete pByte;



}

[解决办法]
有几个资源没有释放. 
tmpBit 没有释放.
你要释放了看看, 系统资源耗尽后会出现很多问题的.
[解决办法]
HBITMAP tmpBit=CreateCompatibleBitmap(hDC,600,400);
HBITMAP hBitmap=(HBITMAP)SelectObject(hDC,tmpBit); // 把当前dc图像选出到hbitmap

楼主,你造成了严重的内存泄露。
注意DeleteObject释放资源。

因此会没效果的。CreateCompatibleBitmap这东西消耗内存了,而且你的图又这么大。能坚持10秒钟说明你机器性能不错哦

热点排行