yxd199512041 发表于 2012-7-12 23:57:29

有比GetPixel获取RGB值效率更快的函数么

有比GetPixel获取RGB值效率更快的函数么?或者更底层的
还有,如果在timer中GetPixel的话,其它程序的窗口就很难拖动,这个怎么解决呢?

马大哈 发表于 2012-7-13 17:55:47

你要搞清楚是调用GetPixel造成的挂起还是调用后处理取得的像素的过程造成的.

这个API我觉得本质上就是一个内存复制,应该不会太耗时的.

Xor 发表于 2012-7-14 15:49:12

不加处理速度如何?你有没有循环GetPixel?建议你从显卡入手,用驱动读取显卡缓存,或者hook显卡驱动调用。。。

yxd199512041 发表于 2012-7-14 20:49:08

Xor 发表于 2012-7-14 15:49 static/image/common/back.gif
不加处理速度如何?你有没有循环GetPixel?建议你从显卡入手,用驱动读取显卡缓存,或者hook显卡驱动调用。 ...

汗。。。我用的VB,操作显卡想都别想。。。。。。

马大哈 发表于 2012-7-15 11:33:45

把这部分的代码发上来看看吧.

另外也可以试试只取需要的范围内的数据,假如你不是需要整个屏幕的数据的话.

yxd199512041 发表于 2012-7-19 11:56:48

本帖最后由 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的),总是很迟钝,有时候图象瞬间变化一下就根本没反应,并且全屏模式不管怎样都没反应

马大哈 发表于 2012-7-21 00:20:03

看来要HOOK DX的API才行.

但DX我不熟啊......

马大哈 发表于 2012-7-21 00:24:04

之前我做打印内容拦截,就是HOOK了EndPage函数,因为在每页完成前一定是要调用它的,参数只有一个,就是hDC.

而DX也是类似的,绘完了要调用一个函数一次性更新.

只要HOOK这个函数,应该就能得到当前图像,我想浩方一类平台在游戏里显示提示,也是这样做的,只是在HOOK到之后再绘字上去.

马大哈 发表于 2012-7-21 21:07:54

...............................{:soso_e140:}

WallesCai 发表于 2012-7-30 16:39:08

如果只是取几点的话,这个够用了, 如果想把整个画面扒下来, 这个歇菜.

并非函数本身慢, 而是一个图片几十上百万个像素, 再快的函数, 调用百万次本身的开销就够喝一壶的了

yxd199512041 发表于 2012-8-1 10:27:33

WallesCai 发表于 2012-7-30 16:39 static/image/common/back.gif
如果只是取几点的话,这个够用了, 如果想把整个画面扒下来, 这个歇菜.

并非函数本身慢, 而是一个图片几十上 ...

可我就是用Getpixel取点啊 并不是全图

WallesCai 发表于 2012-8-1 11:45:55

yxd199512041 发表于 2012-8-1 10:27 static/image/common/back.gif
可我就是用Getpixel取点啊 并不是全图

取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧.

WallesCai 发表于 2012-8-1 11:59:13

yxd199512041 发表于 2012-8-1 10:27 static/image/common/back.gif
可我就是用Getpixel取点啊 并不是全图

取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧.

yxd199512041 发表于 2012-8-1 19:49:53

WallesCai 发表于 2012-8-1 11:59
取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧. ...

这就是主要功能,就是实时取得点RGB值

WallesCai 发表于 2012-8-13 10:02:23

yxd199512041 发表于 2012-8-1 19:49 static/image/common/back.gif
这就是主要功能,就是实时取得点RGB值

再看看你的Timer是否触发间隔太小了? 设成1了?
如果是游戏的话, 设成200, 五分之一秒的反应也不算慢了吧.

WallesCai 发表于 2012-8-20 08:55:32

yxd199512041恩 不过我没电脑了发表于 7 小时前

yxd199512041恩 不过我没电脑了发表于 7 小时前

电脑坏了?

lyf1314 发表于 2012-10-12 13:21:52

   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快了不止一点半点了吧?

lyf1314 发表于 2012-10-12 13:22:44

复制1440*900的颜色点,顺便全部遍历一次也就几十毫秒

写写 发表于 2012-11-21 18:54:44

有点搞不清爽

飘在未来 发表于 2012-12-12 22:41:04

不懂!!!!!
页: [1]
查看完整版本: 有比GetPixel获取RGB值效率更快的函数么