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秒钟说明你机器性能不错哦