opq6789 发表于 2012-5-24 18:41:35

请教关于PixelGetColor在win7系统下的效率问题

因为在win7系统下做ocr研究,发现通过使用PixelGetColor截取矩形区域点阵的时候速度非常缓慢,一次性获取1000个像素点颜色基本要花费超过1分钟的时间,而同样的操作在xp系统下只需要0.025s,甚至更少

当然我也在win7下找到了临时解决的办法,就是将系统主题更换为 Windows 7 Basic,这样上面的操作在win7系统下也可以在100毫秒内执行完成

想请教各位,有没有其它的解决办法,毕竟每次调整系统主题不是最好的解决办法,我在网上看到AHK也遇到了类似的问题,貌似他们官网提供了一个fastpixelgetcolor()函数专门用于win7系统,想请教一下我们的Au3应该如何解决这个问题,毕竟现在使用win7系统的朋友已经越来越多了,谢谢

再发一下这个问题,看看有人知道怎么处理吗,好纠结的一个问题

jxfa0086768 发表于 2012-5-24 18:48:01

路过帮忙顶起!

magusneo 发表于 2012-5-24 19:52:07

用大漠插件试试,速度快很多
还有直接ocr功能

happytc 发表于 2012-5-24 20:47:13

本帖最后由 happytc 于 2012-5-24 20:50 编辑

回复 1# opq6789


    我猜,我猜,我猜猜猜!
你的Win7肯定开启了DWM,你关掉之后你就会发现速度马上就上去了,估计可以提高1000倍!
所以解决方法也就出来了:
① 关掉DWM后再用PixelGetColor函数
② 用_GDIPlus_BitmapLockBits替代PixelGetColor,_GDIPlus_BitmapLockBits不受DWM影响,(怎么用?别问我,你可以搜索我关于一个‘马赛克’帖子的回复),就是不开启DWM,前者效率也比后者高上10来倍
http://www.autoitx.com/forum.php?mod=viewthread&tid=31334&extra=&highlight=%C2%ED%C8%FC%BF%CB&page=2

happytc 发表于 2012-5-24 21:14:36

回复 1# opq6789


    你把那个ahk的什么fastpixelgetcolor()函数帖出来看看
说不定就是采用了上面我说的方法二呢

opq6789 发表于 2012-5-24 22:58:59

回复 4# happytc


   呵呵,谢谢,这会儿在朋友这里不方便,我明天仔细研究下再上来回复

另外今天下午在autoit的官网上看到有国外的朋友也有很多遇到类似的问题,貌似autoit官方给出的解决方法也是建议关闭DWM,明天一并研究下

opq6789 发表于 2012-5-24 23:01:21

回复 3# magusneo


    谢谢,回头研究一下,不过我要做的ocr必须达到100%识别,所以很多第三方朋友的插件我都没有办法用,只能自己写

opq6789 发表于 2012-5-25 14:05:10

回复 4# happytc


    通过粗略的搜索Autoit官方站点,发现这个问题Autoit一直没有官方正面解决,大部分方法都是大家自己研究出来的,目前主要的解决办法有几种,分别如下:

1、关闭DWM,关闭的方法主要有以下几种

       - 切换win7主题,面右键 -> 个性化 -> 选择window7 Basic桌面主题

       - 直接任务管理器Kill dwm.exe进程2次

       - 停止Desktop Window Manager服务

   - 或者在软件中加入调用如下代码,自动检测是否开启了dwm,然后临时关闭,软件退出后自动恢复If _DwmIsEnabled() = True Then DllCall("dwmapi.dll", "uint", "DwmEnableComposition", "int", 'False')

Func _DwmIsEnabled()
    If FileExists(@SystemDir & "\dwmapi.dll") Then
      $Receiver = DllStructCreate("int")
      $aTemp = DllCall("dwmapi.dll", "uint", "DwmIsCompositionEnabled", "ptr", DllStructGetPtr($Receiver, 1))

      $Receiver2 = DllStructCreate("int", $aTemp)
      If DllStructGetData($Receiver2, 1) = True Then
            Return 1
      Else
            Return SetError(1, 0, 0)
      EndIf
    Else
      Return SetError(2, 0, 0)
    EndIf
EndFunc2、通过ScreenCapture截取屏幕到内存,然后直接从内存中读取相应点的像素

    - 这个我具体没有时间测试效率如何,感觉应该也很快,代码和例子发布出来大家可以一起研究研究

      

3、另外happytc 的用_GDIPlus_BitmapLockBits替代PixelGetColor的方法应该也是可行的,具体的效率我还没有测试,一起总结进来

    http://www.autoitx.com/forum.php?mod=viewthread&tid=31334&extra=&highlight=%C2%ED%C8%FC%BF%CB&page=2

zch11230 发表于 2012-5-27 07:43:43

我曾经也遇到这个问题 我一直以为是我电脑的问题 后来换大漠了现在知道原因了也好。
页: [1]
查看完整版本: 请教关于PixelGetColor在win7系统下的效率问题