换个分辨率脚本就罢工?问题多半出在你写死了坐标
有个场景几乎每个写图色脚本的人都撞过:在自己电脑上跑得好好的,发给朋友,或者换台显示器、改个缩放比例,脚本就满屏点错位置。第一反应往往是「他环境有问题」,其实问题在自己——你把坐标写死了。
绝对坐标为什么靠不住
你在 1920×1080 上截的图、记的点击点 (960, 540),是「绝对像素」。一旦对方屏幕是 1366×768,或者系统缩放设了 125%,同一个按钮的实际像素位置就全变了。脚本还按 (960,540) 点,自然点空。根因是:你记录的是「某块屏幕上的位置」,而不是「按钮在画面里的相对位置」。
解法一句话:把所有坐标归一化。存的时候不存绝对像素,存相对比例:
# 存相对坐标,而不是绝对像素 rel_x = click_x / screen_w # 0~1 之间 rel_y = click_y / screen_h # 运行时按当前分辨率换算回去 real_x = int(rel_x * current_w) real_y = int(rel_y * current_h)
这样无论屏幕多大,按钮都在画面 50% 宽、50% 高的地方,换算回去永远对。我现在的习惯是:脚本内部一律用归一化坐标,只在最后真正发鼠标事件时才乘回当前分辨率。
但归一化治不了所有病
归一化假设你点的目标「按比例缩放后位置不变」。大多数 GUI 程序确实如此,但有两种例外:
- 非等比布局:有些界面两侧留白固定、中间区域拉伸。按钮相对整个屏幕的比例会随宽度变化,单纯乘比例就偏了。这时要找「锚点」——以某个固定尺寸的参照物(如顶栏 logo)为基准算偏移,而不是以全屏为基准。
- DPI 缩放导致内容重排:125% 缩放下,文字换行位置变,按钮可能换行到第二行。这种情况连锚点都不稳,得靠找图(模板匹配)动态定位,而不是算坐标。
这也引出关键一点:模板匹配天生抗分辨率。因为它直接在大图里找小图的样子,只要模板和截图同分辨率(或做多尺度),按钮挪到哪都能认出来,不用你操心比例。坐标归一化适合「我知道点哪、只是屏幕大小不同」的场景;目标位置本身会变、甚至长相都变的,还是老老实实找图更稳。
还有个隐蔽坑:Windows 的「缩放与布局」设成 125% 时,某些截图 API 拿到的仍是逻辑分辨率,另一些拿到物理分辨率。脚本里读屏幕宽高和截图宽高必须同源,否则你算出来的 real_x 会整体错位一个缩放因子。
坐标归一化听着像小学生常识,但它替我省下的调试时间,够我每次改完脚本安心喝杯茶。很多脚本「换台机器就废」,根子不在环境,在你当初记坐标时太偷懒——把「这块屏幕」当成了「全世界」。
