有比GetPixel获取RGB值效率更快的函数么
有比GetPixel获取RGB值效率更快的函数么?或者更底层的还有,如果在timer中GetPixel的话,其它程序的窗口就很难拖动,这个怎么解决呢? 你要搞清楚是调用GetPixel造成的挂起还是调用后处理取得的像素的过程造成的.
这个API我觉得本质上就是一个内存复制,应该不会太耗时的. 不加处理速度如何?你有没有循环GetPixel?建议你从显卡入手,用驱动读取显卡缓存,或者hook显卡驱动调用。。。 Xor 发表于 2012-7-14 15:49 static/image/common/back.gif
不加处理速度如何?你有没有循环GetPixel?建议你从显卡入手,用驱动读取显卡缓存,或者hook显卡驱动调用。 ...
汗。。。我用的VB,操作显卡想都别想。。。。。。 把这部分的代码发上来看看吧.
另外也可以试试只取需要的范围内的数据,假如你不是需要整个屏幕的数据的话. 本帖最后由 yxd199512041 于 2012-7-19 12:00 编辑
马大哈 发表于 2012-7-15 11:33 static/image/common/back.gif
把这部分的代码发上来看看吧.
另外也可以试试只取需要的范围内的数据,假如你不是需要整个屏幕的数据的话. ...
核心代码:
Public Function GetDcColor() As Double
GetDcColor = GetPixel(destHdc, p.x + 1, p.y + 1)
End Function
'timer interval=1ms
Private Sub Tracker_Timer()
Cnew = GetDcColor
If Not Cold = Cnew Then
Cold = Cnew
ClickMouse MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP
End If
End Sub
desthdc=getdc(0)
窗口是DX窗口(d3d的),总是很迟钝,有时候图象瞬间变化一下就根本没反应,并且全屏模式不管怎样都没反应 看来要HOOK DX的API才行.
但DX我不熟啊...... 之前我做打印内容拦截,就是HOOK了EndPage函数,因为在每页完成前一定是要调用它的,参数只有一个,就是hDC.
而DX也是类似的,绘完了要调用一个函数一次性更新.
只要HOOK这个函数,应该就能得到当前图像,我想浩方一类平台在游戏里显示提示,也是这样做的,只是在HOOK到之后再绘字上去. ...............................{:soso_e140:} 如果只是取几点的话,这个够用了, 如果想把整个画面扒下来, 这个歇菜.
并非函数本身慢, 而是一个图片几十上百万个像素, 再快的函数, 调用百万次本身的开销就够喝一壶的了 WallesCai 发表于 2012-7-30 16:39 static/image/common/back.gif
如果只是取几点的话,这个够用了, 如果想把整个画面扒下来, 这个歇菜.
并非函数本身慢, 而是一个图片几十上 ...
可我就是用Getpixel取点啊 并不是全图 yxd199512041 发表于 2012-8-1 10:27 static/image/common/back.gif
可我就是用Getpixel取点啊 并不是全图
取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧. yxd199512041 发表于 2012-8-1 10:27 static/image/common/back.gif
可我就是用Getpixel取点啊 并不是全图
取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧. WallesCai 发表于 2012-8-1 11:59
取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧. ...
这就是主要功能,就是实时取得点RGB值 yxd199512041 发表于 2012-8-1 19:49 static/image/common/back.gif
这就是主要功能,就是实时取得点RGB值
再看看你的Timer是否触发间隔太小了? 设成1了?
如果是游戏的话, 设成200, 五分之一秒的反应也不算慢了吧. yxd199512041恩 不过我没电脑了发表于 7 小时前
yxd199512041恩 不过我没电脑了发表于 7 小时前
电脑坏了? hBMPhDC = GetDC(0)
hDCmem = CreateCompatibleDC(hBMPhDC)
Pic1Handle = CreateCompatibleBitmap(hBMPhDC, Right, Bottom)
hBmpPrev = SelectObject(hDCmem, Pic1Handle)
BitBlt hDCmem, 0, 0, Right, Bottom, hBMPhDC, Left, Top, SRCCOPY
DeleteDC hDCmem
i = GetDIBits(hBMPhDC, Pic1Handle, 0, H, fPic(0, 0, 0), BI1, 0)
这样呢?速度比getpixel快了不止一点半点了吧? 复制1440*900的颜色点,顺便全部遍历一次也就几十毫秒 有点搞不清爽 不懂!!!!!
页:
[1]