W
wwolf
Unregistered / Unconfirmed
GUEST, unregistred user!
怎样才能在第一时间知道屏幕中有变化?
我原本的设计思路是这样的:
1.用Bitblt抓屏到一个DIB中,将此DIB和上一幅XOR。
2.将XOR后的异或图分块。
3.用Scanline对每块的像素进行比较。
4.如果有某一像素的色值不是黑色则表示此小块有变动。
5.如果是都黑色,则表示此小块没有变动。
6.继续从第3步开始,直到所有小块比较完毕。
7.Sleep(15)延时15毫秒后,继续第1步开始。
抓屏的代码是:
QueryPerformanceFrequency(count);//得到震荡频率
QueryPerformanceCounter(First);//取得已震荡次数
Fullscreen.PixelFormat :=pf16bit;//当前屏幕是800*600 16位色
bitblt(Fullscreen.Canvas.Handle,0,0,800,600,SCRDC,0,0,SRCCopy);//要35ms
Fullscreen.PixelFormat :=pf8bit;//如果有此句,则要多花 68ms
QueryPerformanceCounter(last);//取得已震荡次数
//将(Last-First)/Count即得经过的时间
我觉得这样抓屏所花的时间太长了,DFW上有不少人说用DirectDraw方式更快。
但我没试过,理论上说应该是会快很多,但到底有多快?谁有具体实现的代码能给我参考
一下吗?还有,如果要将图转为256色,有更好更快的方法吗?
还有,哪位高手能说说我这样做,思路对吗,或者说说更好的思路。
拜托各位啦!!各位路过的朋友,即来之,则帮个忙提一下。谢谢!!
我原本的设计思路是这样的:
1.用Bitblt抓屏到一个DIB中,将此DIB和上一幅XOR。
2.将XOR后的异或图分块。
3.用Scanline对每块的像素进行比较。
4.如果有某一像素的色值不是黑色则表示此小块有变动。
5.如果是都黑色,则表示此小块没有变动。
6.继续从第3步开始,直到所有小块比较完毕。
7.Sleep(15)延时15毫秒后,继续第1步开始。
抓屏的代码是:
QueryPerformanceFrequency(count);//得到震荡频率
QueryPerformanceCounter(First);//取得已震荡次数
Fullscreen.PixelFormat :=pf16bit;//当前屏幕是800*600 16位色
bitblt(Fullscreen.Canvas.Handle,0,0,800,600,SCRDC,0,0,SRCCopy);//要35ms
Fullscreen.PixelFormat :=pf8bit;//如果有此句,则要多花 68ms
QueryPerformanceCounter(last);//取得已震荡次数
//将(Last-First)/Count即得经过的时间
我觉得这样抓屏所花的时间太长了,DFW上有不少人说用DirectDraw方式更快。
但我没试过,理论上说应该是会快很多,但到底有多快?谁有具体实现的代码能给我参考
一下吗?还有,如果要将图转为256色,有更好更快的方法吗?
还有,哪位高手能说说我这样做,思路对吗,或者说说更好的思路。
拜托各位啦!!各位路过的朋友,即来之,则帮个忙提一下。谢谢!!