找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 26583|回复: 19

[交流] 有比GetPixel获取RGB值效率更快的函数么

 火.. [复制链接]

71

主题

350

回帖

2

精华

钻石会员

积分
4123
发表于 2012-7-12 23:57:29 | 显示全部楼层 |阅读模式
有比GetPixel获取RGB值效率更快的函数么?或者更底层的
还有,如果在timer中GetPixel的话,其它程序的窗口就很难拖动,这个怎么解决呢?

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-7-13 17:55:47 | 显示全部楼层
你要搞清楚是调用GetPixel造成的挂起还是调用后处理取得的像素的过程造成的.

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

点评

可我想做个cs秒狙工具,反应太慢。。  发表于 2012-7-13 18:25
我就是嗷嗷叫的老马了......

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
发表于 2012-7-14 15:49:12 | 显示全部楼层
不加处理速度如何?你有没有循环GetPixel?建议你从显卡入手,用驱动读取显卡缓存,或者hook显卡驱动调用。。。
Do my best.

71

主题

350

回帖

2

精华

钻石会员

积分
4123
 楼主| 发表于 2012-7-14 20:49:08 | 显示全部楼层
Xor 发表于 2012-7-14 15:49
不加处理速度如何?你有没有循环GetPixel?建议你从显卡入手,用驱动读取显卡缓存,或者hook显卡驱动调用。 ...

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

点评

Xor
那就别用vb,因为这种事情vb效率不高  发表于 2012-7-15 08:33

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-7-15 11:33:45 | 显示全部楼层
把这部分的代码发上来看看吧.

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

71

主题

350

回帖

2

精华

钻石会员

积分
4123
 楼主| 发表于 2012-7-19 11:56:48 | 显示全部楼层
本帖最后由 yxd199512041 于 2012-7-19 12:00 编辑
马大哈 发表于 2012-7-15 11:33
把这部分的代码发上来看看吧.

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


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

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-7-21 00:20:03 | 显示全部楼层
看来要HOOK DX的API才行.

但DX我不熟啊......
我就是嗷嗷叫的老马了......

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-7-21 00:24:04 | 显示全部楼层
之前我做打印内容拦截,就是HOOK了EndPage函数,因为在每页完成前一定是要调用它的,参数只有一个,就是hDC.

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

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

点评

偶放弃。。  发表于 2012-7-21 11:16
我就是嗷嗷叫的老马了......

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-7-21 21:07:54 | 显示全部楼层
...............................{:soso_e140:}
我就是嗷嗷叫的老马了......

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-7-30 16:39:08 | 显示全部楼层
如果只是取几点的话,这个够用了, 如果想把整个画面扒下来, 这个歇菜.

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

71

主题

350

回帖

2

精华

钻石会员

积分
4123
 楼主| 发表于 2012-8-1 10:27:33 | 显示全部楼层
WallesCai 发表于 2012-7-30 16:39
如果只是取几点的话,这个够用了, 如果想把整个画面扒下来, 这个歇菜.

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

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

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-8-1 11:45:55 | 显示全部楼层
yxd199512041 发表于 2012-8-1 10:27
可我就是用Getpixel取点啊 并不是全图

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

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-8-1 11:59:13 | 显示全部楼层
yxd199512041 发表于 2012-8-1 10:27
可我就是用Getpixel取点啊 并不是全图

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

71

主题

350

回帖

2

精华

钻石会员

积分
4123
 楼主| 发表于 2012-8-1 19:49:53 来自手机 | 显示全部楼层
WallesCai 发表于 2012-8-1 11:59
取几个点的话足够了, 效率相差不大, 没必要穷折腾, 把精力放在主要功能上吧. ...

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

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-8-13 10:02:23 | 显示全部楼层
yxd199512041 发表于 2012-8-1 19:49
这就是主要功能,就是实时取得点RGB值

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

点评

恩 不过我没电脑了  发表于 2012-8-20 01:05
恩 不过我没电脑了  发表于 2012-8-20 01:04

0

主题

53

回帖

0

精华

铜牌会员

积分
165
发表于 2012-8-20 08:55:32 | 显示全部楼层
yxd199512041  恩 不过我没电脑了  发表于 7 小时前

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


电脑坏了?

点评

没收了。。5555  发表于 2012-8-20 17:27

1

主题

8

回帖

0

精华

铜牌会员

积分
34
发表于 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快了不止一点半点了吧?

1

主题

8

回帖

0

精华

铜牌会员

积分
34
发表于 2012-10-12 13:22:44 | 显示全部楼层
复制1440*900的颜色点,顺便全部遍历一次也就几十毫秒

点评

唉 两个月没碰过电脑了。。  发表于 2012-11-19 12:58

评分

参与人数 1水晶币 +5 收起 理由
yxd199512041 + 5 3Q

查看全部评分

0

主题

12

回帖

0

精华

铜牌会员

积分
46
发表于 2012-11-21 18:54:44 | 显示全部楼层
有点搞不清爽

10

主题

92

回帖

0

精华

银牌会员

积分
381
发表于 2012-12-12 22:41:04 | 显示全部楼层
不懂!!!!!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表