找回密码
 加入
搜索
查看: 6027|回复: 8

[图形处理] 请教关于PixelGetColor在win7系统下的效率问题

  [复制链接]
发表于 2012-5-24 18:41:35 | 显示全部楼层 |阅读模式
因为在win7系统下做ocr研究,发现通过使用PixelGetColor截取矩形区域点阵的时候速度非常缓慢,一次性获取1000个像素点颜色基本要花费超过1分钟的时间,而同样的操作在xp系统下只需要0.025s,甚至更少

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

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

再发一下这个问题,看看有人知道怎么处理吗,好纠结的一个问题
发表于 2012-5-24 18:48:01 | 显示全部楼层
路过帮忙顶起!
发表于 2012-5-24 19:52:07 | 显示全部楼层
用大漠插件试试,速度快很多
还有直接ocr功能
发表于 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 ... FC%BF%CB&page=2
发表于 2012-5-24 21:14:36 | 显示全部楼层
回复 1# opq6789


    你把那个ahk的什么fastpixelgetcolor()函数帖出来看看
说不定就是采用了上面我说的方法二呢
 楼主| 发表于 2012-5-24 22:58:59 | 显示全部楼层
回复 4# happytc


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

  另外今天下午在autoit的官网上看到有国外的朋友也有很多遇到类似的问题,貌似autoit官方给出的解决方法也是建议关闭DWM,明天一并研究下
 楼主| 发表于 2012-5-24 23:01:21 | 显示全部楼层
回复 3# magusneo


    谢谢,回头研究一下,不过我要做的ocr必须达到100%识别,所以很多第三方朋友的插件我都没有办法用,只能自己写
 楼主| 发表于 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[1])
        If DllStructGetData($Receiver2, 1) = True Then
            Return 1
        Else
            Return SetError(1, 0, 0)
        EndIf
    Else
        Return SetError(2, 0, 0)
    EndIf
EndFunc
2、通过ScreenCapture截取屏幕到内存,然后直接从内存中读取相应点的像素

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

      

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

    http://www.autoitx.com/forum.php ... FC%BF%CB&page=2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-5-27 07:43:43 | 显示全部楼层
我曾经也遇到这个问题 我一直以为是我电脑的问题 后来换大漠了  现在知道原因了也好。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-6 20:36 , Processed in 0.096589 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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