尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

大漠插件找图找字实战:字库制作、参数调优与易语言调用全攻略

大漠插件找图找字实战:字库制作、参数调优与易语言调用全攻略 大漠插件里的找图找字是很多人入门Windows界面自动化时第一道坎。网上教程不少但真正把ziku0.txt字库制作、大漠综合工具操作、易语言代码调用这条链完整跑通的人不多。我早期做窗口自动化工具时在这上面栽过不少跟头最惨的一次是字库搞了三小时识别率还是稀烂最后发现是偏色参数写反了。这篇文章就把我这几年整理出来的实操经验和踩坑记录摊开来讲从字库文件格式、制作流程到接口参数选择、易语言接入再到常见问题排查争取帮你少走几个月的弯路。文章主要面向两类人一是刚接触大漠插件、正在研究找图找字接口的易语言新手二是已经有基础但被识别率、字库制作、坐标偏移这些问题卡住的老手。文里提到的思路和命令我在Windows 7到Windows 11上都实测过大部分问题都有对应的解决套路可以直接抄作业。1. 先把ziku0.txt这个文件彻底搞明白1.1 ziku0.txt到底是什么很多新手第一次接触字库看教程里写“SetDict 0, ziku0.txt”就直接照着抄但完全不理解这个文件为什么叫ziku0、里面存的是什么、大漠到底怎么用它的。大漠的字库本质上就是“字符点阵的字典”。它把你要识别的每一个字符记录成一个由十六进制数据组成的点阵快照。比如你要识别数字“123”那字库里就会有三行记录分别描述“1”长什么样、“2”长什么样、“3”长什么样。当大漠执行找字命令时它会在你指定的屏幕范围内把画面二值化然后和字库里的点阵快照做逐点比对匹配上了就返回坐标。ziku0.txt这个名字里的“0”代表字库的索引编号。大漠的SetDict命令可以同时加载多个字库用编号0、1、2区分。文件名本身并不是固定的你可以叫它abc.txt但习惯上大家都会用ziku0、ziku1这种简单命名的方便管理和切换。真正让新手懵圈的是文件内部结构。打开一个正常的ziku0.txt你会发现每行格式大概是这样字符内容;每行像素的十六进制序列前面的文字部分就是你要匹配的字符本身分号后面是该字符对应的点阵数据。每一段数据对应点阵中的一行像素好几段连在一起就拼出整个字的形状。这里有个很关键的细节字库文件必须是无BOM的UTF-8或ANSI编码。如果你用记事本另存为UTF-8带BOM大漠加载时可能直接崩溃或者识别出来全是乱码。1.2 为什么我不建议手写字库我见过有人看完格式说明后决定手写十六进制点阵来生成字库。我坦诚说这个方法理论可行实际非常痛苦。举个例子一个“甲”字如果按8号字体、12x14点阵来算你至少需要14行十六进制数据每一行还要精确到每个比特位的01状态稍错一位识别就废了。而且手写只能针对特定字体、特定字号换个字号全部重写。大漠官方很贴心地提供了大漠综合工具可以自动从屏幕截取字符区域、自动切割字符、自动生成点阵数据。正确做法永远是先用综合工具抓图取字再微调最后导出字库文件。这个流程十分钟就能搞定一个含几十个字符的字库手写可能要写一整天。1.3 用大漠综合工具制作字库的完整流程大漠综合工具一般是和插件一起下载的有些版本叫“大漠综合工具”或“大漠字库工具”。打开后界面不算复杂核心就是“抓屏幕区域 - 切割字符 - 录入字符 - 保存字库”。第一步把你要识别的界面调出来让目标文字显示在屏幕上。比如你要识别一个软件的按钮文字就把按钮停在屏幕上。然后在综合工具里选择“抓图”或“找字”相关模块框选出包含所有目标字符的区域截图到工具里。第二步在工具里对截图做二值化处理。大漠找字的原理是基于二值化后的黑白点阵所以这一步很关键。调节“阈值”滑块让文字变成清晰的黑色、背景变成白色。如果怎么调都糊说明原图文字太小或者背景太花建议放大系统字体后再抓。第三步使用工具的“字符切割”功能。它会自动把选中的图像区域按字符之间的空白间隙切成若干小块。切分完成后每个小块对应一个字符你只需要在旁边输入这个字符的实际内容然后点“添加到字库”。第四步全部字符都录入后点“保存字库”文件名填ziku0.txt保存路径要和你的脚本工程可访问路径对得上。这里有一个大坑切割出的字符块之间如果有残留的噪点或半个笔画一定要手动清理掉否则识别时会把噪点当成字符的一部分直接导致匹配失败。你可以用工具的橡皮擦功能逐个像素清理虽然繁琐但值得。2. 找字接口的调用姿势与配置逻辑2.1 加载字库和切换字库的正确用法字库做完了下一步就是在易语言里调用了。大漠的找字接口有很多但用法都有一个共同前置步骤先加载字库。对象名.SetDict 0, ziku0.txt这段代码的意思是把ziku0.txt加载为编号为0的字库。如果你有两个字库比如一个识数字、一个识中文可以分别加载对象名.SetDict 0, ziku0.txt 对象名.SetDict 1, ziku1.txt需要切换识别时用UseDict命令指定当前使用哪个字库对象名.UseDict 0这里有个容易忽略的点SetDict加载的是字库文件的路径要用绝对路径或相对路径。如果脚本工作目录和字库文件不在同一个目录最好写绝对路径否则加载失败时会报“字库不存在”或者直接返回空坐标。我习惯把字库文件和exe放在同一目录代码里用“取运行目录()”拼接这样换电脑迁移也不会出问题。2.2 FindStr系列接口到底选哪个大漠找字最常用的几个接口是FindStr、FindStrEx、FindStrFast三者区别值得仔细说下。FindStr是最基础的版本在指定区域内寻找一个或多个字符返回第一个匹配的坐标。第一次调用时会做初始化速度稍慢但胜在稳定。示例对象名.FindStr 0, 0, 2000, 1000, 2024, 202020, 0.9, 返回X, 返回Y如果找到返回X和返回Y就是目标左上角坐标找不到则返回-1。FindStrEx是扩展版可以找出区域里所有匹配的位置返回字符串格式是一串坐标比如“x1,y1|x2,y2|...”。适合需要识别多个相同字符的场景比如统计一个页面里有多少个“确认”按钮。FindStrFast是快速版核心优化在于它会把首次识别区域的图像缓存下来下次再识别同一个区域时速度大幅提升。代价是如果屏幕内容变了必须先调用“ResetStrFast”刷新缓存否则会一直识别旧图。我的习惯是界面静止时才用FindStrFast动态界面老老实实用FindStr。2.3 偏色和相似度到底怎么调才靠谱这是我认为整个找图找字里最玄学也最核心的参数值得花点时间说透。偏色参数是个六位十六进制数格式是RRGGBB分别对应红、绿、蓝三个通道允许的色差范围。比如“101010”就表示红色通道允许正负16的偏差绿色也允许正负16蓝色同样。找字时大漠会判断屏幕上的某个像素点如果它的RGB值跟字库里记录的颜色在偏色范围内就认为它是有效的字符像素。偏色设太小字体的抗锯齿边缘、背景色轻微变化都会被当成不匹配识别率暴跌。偏色设太大又容易把相近颜色的背景噪点误认为字符。我实测下来白底黑字场景用“202020”起步比较稳彩色按钮上的白字建议直接“404040”模糊字体或缩放过的界面建议“606060”甚至更高。相似度是另一层过滤。0.9代表允许10%的像素点不匹配1.0代表必须完全一致。我在实际项目里的经验值是清晰截图的文字用0.9压缩过的截图或低分辨率渲染的文字用0.8再低就容易误报了。需要反复试错逐步从低往高调找到临界点。3. 找图找字的坐标系和边界陷阱3.1 范围参数和返回坐标的对应关系大漠的所有找图找字接口都要求你指定一个搜索区域格式是(x1, y1, x2, y2)代表左上角和右下角。这里有个很常见的坑区域范围过大会降低性能过小会漏检目标。如果你指定的区域比实际字符区域大出很多大漠会先把整个区域扫描一遍字符点阵要逐行比对时间开销成倍增长。我见过有人找一个小按钮文字区域却设置成了全屏1920x1080结果单次找字耗时快200毫秒循环里跑起来肉眼可见地卡。反之如果你把区域框得只剩目标的一半字符显示位置稍有变化就找不到了。另一个容易混淆的是返回坐标的含义。FindStr返回的坐标是目标字符区域的左上角而不是中心点。FindPic找图返回的坐标默认也是图片左上角除非你用FindPicEx的返回格式来解析。这个差异在点击操作时影响很大如果你直接把返回坐标当点击坐标用点到的位置会偏右偏下。我通常会在代码里加上偏移比如点击字符中心点击X 返回X 字符宽度 / 2 点击Y 返回Y 字符高度 / 23.2 窗口移动、缩放和多显示器的坑窗口自动化里最折磨人的就是窗口位置变化。窗口一旦移动之前在固定坐标范围内的找图找字逻辑就全部失效。解决办法通常是先获取窗口句柄和窗口位置动态计算搜索区域。易语言里可以通过窗口API拿到目标窗口的左上角坐标然后以大漠区域参数为基础做偏移取窗口位置(窗口句柄, 窗口X, 窗口Y) 目标区域X1 窗口X 固定偏移X这里有一个非常隐蔽的坑Windows的DPI缩放。如果你的系统显示比例是125%或者150%大漠默认拿到的坐标和实际渲染分辨率是不一致的。你会发现找图找字始终偏一格或者在小窗口正常、全屏时失灵。我的处理方式是在脚本启动时调用API禁用DPI缩放或者在系统层面把目标程序设为“替代高DPI缩放行为”。不同Windows版本的设置入口不一样但本质都是让程序感知真实的物理像素而不是缩放后的逻辑像素。多显示器也是一个头疼点。副屏上的坐标如果和主屏混用很容易出现负数坐标或超出范围的诡异行为。我建议你在代码里预处理统一用虚拟屏幕坐标系统并确保目标窗口在主显示器上运行否则所有区域参数都要重新计算。3.3 找图用的图库制作从抓图到存盘的正确路径说完找字顺便把找图也一起讲清楚因为两者的避坑思路是共通的。找图的前提是先有一张“模板图”这张图是被识别对象的标准图像。制作模板图最好用的方法就是用大漠综合工具或大漠的Capture接口直接截取屏幕。截的时候有几点建议一是截取范围要紧贴目标图形边缘留白越少越好。留白多了模板图中的背景色会被带入匹配计算如果目标位置的背景稍有变化就会匹配失败。二是在不同背景下截取同一图形时尽量选择对比度高、背景单一的截图作为模板这样鲁棒性更好。三是图片保存格式上我统一用24位BMP。虽然大漠也支持PNG但BMP的无压缩特性让找图接口在解析时更快、更稳定。找图接口的关键参数除了区域和偏色外还有一个“查找方向”参数决定从哪个方向开始搜索匹配。默认从左上往右下如果你知道目标大概在屏幕下方可以指定从下往上搜速度能提升不少。4. 易语言里接入大漠的实操经验4.1 DLL注册和对象创建的正确姿势易语言调用大漠本质是通过COM组件方式调用的。首先要把大漠的DLL在系统里注册好注册方式是在命令行执行regsvr32 大漠DLL路径注册成功后会提示“DllRegisterServer succeeded”。有些版本的大漠DLL没有regsvr32入口需要调用它自带的Reg接口来注册具体看版本。如果注册不成功最常见原因是权限不足一定要用管理员身份打开命令行。杀毒软件也可能拦截DLL注册我一般会在注册前把所在目录加入白名单。注册成功后在易语言里创建对象代码是这样.版本 2 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型 .局部变量 大漠, 对象 大漠.创建 (“dm.dmsoft”, )第二行字符串“dm.dmsoft”是大漠插件的ProgID固定写法。对象创建失败一般有两种情况一是DLL没注册成功二是系统缺少VC运行库。如果你在别的电脑上运行报错“不能创建对象”优先检查这两项。4.2 线程环境下的大漠脚本几个致命隐患易语言开发自动化脚本几乎离不开多线程。但大漠插件的COM对象在线程里使用有几条血泪教训值得牢记。第一对象不要跨线程传递。在界面线程里创建了大漠对象然后直接把这个对象传给工作线程用轻则警告、重则崩溃。正确做法是在每个线程内部独立创建自己的大漠对象实例各用各的。第二多线程同时找图找字时尽量使用不同的字库编号避免共享字库索引出现并发冲突。虽然大漠内部做了加锁处理但我在高并发场景下实测还是有极低概率返回异常结果用独立字库能最大限度规避。第三线程退出前必须释放对象。易语言的“对象”变量在退出子程序时会自动释放但如果你用启动线程方式反复创建和销毁线程系统会有短暂的对象释放延迟此时立即再创建新线程容易引发内存访问冲突。稳妥做法是线程结束后加一个200毫秒左右的延时再继续创建新线程。第四循环识别时一定要加延时。用“延时(50)”或“延时(100)”都行别让识别循环空转把CPU吃满。这不光是为省资源更是给窗口消息循环留出处理时间避免目标程序因为消息堆积而卡死。4.3 大漠综合工具与易语言脚本的联动工作流综合工具不只是用来做字库的它还能帮你快速定位坐标、验证接口调用结果。我每做一个新项目都会先跑一遍这个联动流程第一步用综合工具打开目标界面截图并标记出所有需要识别和操作的位置得到初步的区域坐标。第二步把标记好的坐标抄到易语言代码里作为区域参数。先不做任何偏移直接跑一次找字找图看返回值和预期是否一致。第三步如果返回值不正常返回综合工具里检查字库、偏色设置重点看屏幕上的目标文字是不是被窗口半透明效果、阴影或高光干扰了。如果是调整偏色或更换截图区域。第四步全部识别逻辑稳定后再考虑把脚本封装成线程循环加上日志输出。日志里记录每次找图找字的返回值、耗时方便日后排障。我特别推荐在综合工具里使用“找图测试”和“找字测试”这两个功能它们可以在不写代码的情况下直接模拟插件的识别过程展示匹配位置。遇到识别问题先在这里验证比在易语言里反复编译调试效率高得多。5. 常见问题与排查实录以下问题是我在大漠插件使用过程中遇到最多、也让别人问过最多的整理成速查表方便大家按图索骥。现象可能原因解决方案加载字库后找字总返回-1字库编码不是ANSI/无BOM UTF-8路径不对用另存为ANSI重新保存改用绝对路径识别出来的字是乱码或错字字符切割时有笔画粘连或残留噪点回到综合工具手动清理字符块重新生成字库找图找字速度极慢搜索区域设置过大误用了FindStrFast缩小区域按需选择接口坐标能识别但点击位置不对返回值是左上角坐标不是中心点手动加上宽高偏移系统字体100%时正常125%时全部失灵DPI缩放导致逻辑像素和物理像素不一致禁用DPI缩放或按缩放比例换算坐标DLL注册失败权限不足或杀软拦截管理员身份注册加入白名单对象创建失败VC运行库缺失或DLL未注册安装运行库重新注册两次同一份代码在Win11下不稳定大漠老版本和Win11渲染兼容性差尝试gdi模式窗口绑定或更新插件版本全屏窗口找图正常最小化后找不到窗口最小化不渲染画面屏幕无内容目标窗口需保持可见或采用后台图色模式同张图换台电脑识别率明显下降显卡驱动/渲染方式导致颜色链偏差提高偏色值用综合工具重新取色制作模板每次遇到识别问题我建议的排查顺序永远是先查字库文件和模板图质量再看偏色相似度最后才怀疑代码逻辑。因为前两者是大多数问题的根源代码逻辑反而相对稳定。最后分享一个我自己养成的小习惯每次新建项目时我会建三个固定命名的字库——ziku0.txt存纯数字、ziku1.txt存中文关键词、ziku2.txt存英文字母。分库管理的好处是某类字符识别率出问题时可以单独重建对应字库不影响其他功能。把所有找图找字参数也统一封装成一个公共子程序传入区域、字库编号、关键字返回坐标后续维护起来只需要改一处能省下大把调试时间。
返回列表