鼠标点击位置记录

  有些时候需要抓取别人图片中的点的信息,应该怎么整?当然是找作者要咯!不过有时可能没办法(例如可能联系不上作者/作者找不到数据了/作者不想给你/作者说你自己提取吧)或则并不需要他图片中的点的准确信息的时候,我们可以自己去点。之前有个perl脚本,但找不到了(这又体现了整理资料和做笔记的必要性),现在python很方便的,调用pynput的Listener就好了。记录鼠标点击的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pynput.mouse import Listener
import logging
from datetime import datetime

# 配置日志记录
logging.basicConfig(
filename="mouse_clicks.log",
level=logging.INFO,
format="%(asctime)s %(message)s",
datefmt="%Y-%m-%dT%H:%M:%S"
)

def on_click(x, y, button, pressed):
if pressed:
message = f"{x} {y}"
print(message) # 输出到屏幕
logging.info(message) # 写入日志文件
if button == button.right:
# 停止监听器
return False

# 启动鼠标监听器
with Listener(on_click=on_click) as listener:
try:
listener.join()
except KeyboardInterrupt:
print("监听器已被用户中断。")

  这个脚本会记录鼠标左键的位置,输出到mouse_clicks.log文件中。mouse_clicks.log文件有三列格式如下:
2025-05-07T17:01:33 1977 1576分别表示点击的时间,x和y坐标。其中y坐标是下面大上面小。此外点击鼠标右键或者输入Ctrl+C就可以结束记录。我一般是怎么做的呢?我先点击图片左下角得到(x0,y0),点击右下角得到(x1,y0),点击左上角得到(x0,y1),然后点击你想要的点。得到mouse_clicks.log以后就可以这么画图。

1
2
3
4
5
6
7
8
9
10
11
12
dat=mouse_clicks.log
#获得x0,y0,x1,y1,他们是参考点
x0=`awk 'NR==1{print $2}' ${dat}`
y0=`awk 'NR==1{print $3}' ${dat}`
x1=`awk 'NR==2{print $2}' ${dat}`
y1=`awk 'NR==3{print $3}' ${dat}`
#获得横纵轴长度(屏幕尺度)
xs=`echo "$x1-$x0" |bc`
ys=`echo "$y0-$y1" |bc`

awk -v x0=$x0 -v y0=$y0 -v xs=$xs -v ys=$ys 'NR>3{print ($2-x0)/xs*2000-1000,(y0-$3)/ys*1500}' ${dat[1]} | gmt psxy -R -J -O -K -W3p,black >>$ps
#这里(2000,1500)是横纵轴实际尺度,-1000表示实际位置调整。

  注意,这种方法仅仅适用于笛卡尔坐标,其他的各种投影都不行。