该软件使用python写的,可以提取像素点的坐标还有也能获取像素点的16进制数据RGB565和RGB888(RGB888仅最新的源码才支持),可以单点坐标也可以按键坐标,甚至可以使用简单的左右键配合使用,自动复制到粘贴板。 该软件支持现有常用格式的bmp、jpg、gif和png等格式,也可以自定义xy复制到粘贴板的比例。
程序已经打包成exe文件可直接双击运行
最新更新的源码并没有很好的打包,需要自己使用pyinstaller -F -w 指令来完成打包
打包步骤是打开cmd窗口,输入:pip install pyinstaller(安装pyinstaller,已经安装可跳过)
然后输入pyinstaller -F -w 【文件路径】
例如:pyinstaller -F -w C:\\Users\MSN\Desktop\11\PythonApplication1.py
也可以参考此链接Python PyInstaller安装和使用教程(详解版) (biancheng.net)
运行平台已经测试过win7_32,win7_64,win10都能运行(旧版),新版打包好的exe仅测试过Win11
exe文件在以下链接(旧版)(不支持RGB888):
百度网盘链接:https://pan.baidu.com/s/1aoE8RcjAgMZQ7BJ9zaKe1Q?pwd=a8b1
提取码:a8b1
以下是完整工程源码链接(最新更新2022.11.26)(支持RGB888):
像素点坐标提取源码/Python提取图片坐标/Python图片坐标获取源码-Python文档类资源-CSDN文库
单独打包好的exe文件链接(旧版)(不支持RGB888):
常用图片像素坐标和16进制颜色提取软件迪文指令集坐标提取_图片像素坐标工具-Python文档类资源-CSDN文库
单独打包好的支持RGB888的exe(最新更新2022.11.26),但是并没有对win11以外平台测试,不行的话就自己使用pyinstaller 打包:
像素点坐标提取源码/Python提取图片坐标/Python图片坐标获取源码-v1.1-Python文档类资源-CSDN文库
自动获取功能:
鼠标左键单击: 单点坐标
鼠标左键按下移动: 按键坐标
鼠标滚轮单击: 像素颜色
鼠标右键按下并移动: 切图坐标
按键坐标就是一个矩形坐标:(左上角X坐标,左上角Y坐标,右下角X坐标,右下Y坐标)
切图坐标就是一个矩形坐标+放的坐标:(左上角X坐标,左上角Y坐标,右下角X坐标,右下Y坐标,左上角X坐标,左上角Y坐标)(此功能适合嵌入式贴图编程)
单点坐标就是一个点坐标:(X坐标,Y坐标)
像素颜色是16进制的RGB565,2022.11.26更新代码支持RGB888
自动复制是指操作后坐标数据自动拷贝到粘贴板上
转换系数是指:比如我需要把800*600的图坐标放大为1024*768,就往里面输入1024/768 = 1.28,输入1.28并且点击设置xy系数就能获取比例放大的坐标信息,注意这个不会修改图片的任何信息,要保持原来的就输入1,算法是:显示的X坐标 = 获取的X坐标*X比例系数
例如:800 * 1.28 = 1024
把自动获取取消后,单击就是对应的坐标
下面的都是源码(旧源码),但是由于时间仓促并没有对代码进行整理,不然的话可以更简洁,由于工作使用的都是C语言,因此代码逻辑很像C语言,如果哪天我有空我会对代码进行整理,编译软件我用的是微软的VS2022,也可以使用Python 3.10版本的IDLE进行编程以下是代码所需的库,有特殊需求的可以自己修改源码
最新的源码可以自己去上面的链接中获取,如果不用RGB888的话,旧版的也够用了
以下是代码所需库
from asyncio.windows_events import NULL
import tkinter as tk
import pyperclip
from PIL import Image
from PIL import ImageTk
from tkinter import filedialog
import sys
以下是程序所需宏定义,像素数单双都行
sys.setrecursionlimit(100000) #设置递归深度
#像素数必须为双数
Start_x = 1
Start_y = 1
End_x = 2
End_y = 2
YRadioVar = 1.0000
XRadioVar = 1.0000
Image
以下是Python新增创建组件和窗口的代码
ws = tk.Tk()
ws.title('Guides QQ:1257784610')
ws.geometry('1100x700+888+444')
pw1=tk.PanedWindow(ws,orient=tk.HORIZONTAL,width = 100,height = 100,sashrelief='groove') # 创建横向分割面板
pw1.pack(fill=tk.BOTH,expand=True) # 尺寸扩展到整个窗体
frame = tk.Frame(pw1 ,width = 900,height = 700)
ws.update_idletasks()
get_fp = filedialog.askopenfilename(filetypes = [("BMP",".bmp"),("PNG",".png"), ("GIF",".gif"),("JPG",".jpg")])
ws.title('Guides QQ:1257784610 '+str(get_fp))
image = Image.open(get_fp)
#获取图片像素点大小
high = image.height #高度
width = image.width #宽度
#print(high,width)
if (high%2) != 0:
high = high-1
if (width%2) != 0:
width = width-1
canvas=tk.Canvas(
frame,
bg='#4A7A8C',
width=100,
height=100,
scrollregion=(2,2,width+3,high+3) # 2改为0会导致光标和画布有点偏移,取消滚动功能就正常
)
canvas.imagecolor = image.convert('RGB')
canvas.src_strlist = canvas.imagecolor.load()
R,G,B = canvas.src_strlist[1, 1]
px = str(hex((R>>3)<<11 | (G>>2)<<5 | B>>3))
#垂直
vertibar=tk.Scrollbar(
frame,
orient=tk.VERTICAL
)
vertibar.pack(side=tk.RIGHT,fill=tk.Y)
vertibar.config(command=canvas.yview)
#水平
horibar=tk.Scrollbar(
frame,
orient=tk.HORIZONTAL
)
horibar.pack(side=tk.BOTTOM,fill=tk.X)
horibar.config(command=canvas.xview)
canvas.config(
xscrollcommand=horibar.set,
yscrollcommand=vertibar.set
)
canvas.img_avatar = ImageTk.PhotoImage(image)
#imgLabel = tk.Label(frame ,image = photo)
#imgLabel.pack()
tk.canvasimage = canvas.create_image(float(width/2)+2,float(high/2)+2 , image=canvas.img_avatar ) #此处加2是为了全部显示
tk.rectangle1 = canvas.create_rectangle(0, 0 , 1 , 1 , outline = "red")
canvas.bind("" , B1_Motion)#鼠标事件
canvas.bind("" , B3_Motion)#鼠标事件
canvas.bind("" , Mouse_dowm)#鼠标事件
canvas.bind("" , Mouse_RIGHT_dowm)#鼠标事件
canvas.bind("" , Mouse_Middle_dowm)#鼠标事件
#ws.bind("", adjust_scrollregion)
canvas.pack(expand=True,side=tk.LEFT,fill=tk.BOTH)
####################################################
v = tk.IntVar()
v.set(5)
v1 = tk.IntVar()
v1.set(1)
Coordinate = tk.StringVar()
Xradio1 = tk.StringVar()
Yradio1 = tk.StringVar()
pw2=tk.PanedWindow(pw1,orient=tk.VERTICAL,width = 100,height = 100,sashrelief='groove')
#pw2.pack(fill=tk.BOTH,expand=True) # 尺寸扩展到整个窗体
frame1 = tk.Frame(pw2)
frame2 = tk.Frame(pw2)
textLabel = tk.Label(frame1 ,text = '出现BUG请重启')
textLabel.grid(column = 0 , row = 0)
Coordinateout = tk.Entry(frame1 , width = 30 , text = Coordinate , state = "readonly" , exportselection = 1)
Coordinateout.grid(column = 0 , row = 1)
LANGS= [("按键坐标" , 1),
("切图坐标" , 2),
("单点坐标" , 3),
("像素颜色" , 4),
("自动获取" , 5)]
for lang ,num in LANGS:
b= tk.Radiobutton(frame2 , text = lang , variable = v , value = num )
b.pack(fill =tk.X)
button6 = tk.Button(frame2 , text = "打开图片" , command = OpenPicture)
button6.pack()
button7 = tk.Checkbutton(frame2 , text = "自动复制" , variable= v1)
button7.pack()
tk.Label(frame2 , text = '请输入X转换系数,默认为1').pack()
X_Radio = tk.Entry(frame2 , width = 20 , textvariable = 1, text = Xradio1 , exportselection = 1)
X_Radio.pack()
Xradio1.set(1)
tk.Label(frame2 , text = '请输入Y转换系数,默认为1').pack()
Y_Radio = tk.Entry(frame2 , width = 20 , textvariable = 1,text = Yradio1 , exportselection = 1)
Y_Radio.pack()
Yradio1.set(1)
button8 = tk.Button(frame2 , text = "设置XY系数" , command = XYRadio_Set)
button8.pack()
#######################################################
pw1.add(frame) # pw1加入fr1组件
pw1.add(pw2) # pw1加入pw2组件
pw2.add(frame1) # pw2加入fr2组件
pw2.add(frame2) # pw2加入fr3组件
ws.mainloop()
以下是鼠标左键按下滑动事件调用的回调函数代码
def B1_Motion(event):
global End_x
global End_y
radioup , raduodown = vertibar.get()
radioxleft , radioxright = horibar.get()
#End_x,End_y = ((canvas.canvasx(event.x)+width * radioxleft)-2 ), ((canvas.canvasx(event.y) + high * radioup)-2) #-2才是对上像素
End_x,End_y = ((event.x+width * radioxleft)-2 ), ((event.y + high * radioup)-2) #-2才是对上像素
#canvas.delete(tk.ALL)
if End_x<0 :
End_x = 0;
if End_y <0:
End_y = 0;
if End_x > width :
End_x = width;
if End_y > high:
End_y = high;
canvas.delete(tk.rectangle1)
tk.rectangle1 = canvas.create_rectangle(Start_x+2, Start_y+2 , End_x +2, End_y +2, outline = "red")#矫正显示矩形刚好对上光标
if v.get() == 1 or v.get() == 5:
result = str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))+','+str(int(End_x*XRadioVar))+','+str(int(End_y*YRadioVar))
Coordinate.set(str(result))
if v1.get() == 1:
pyperclip.copy(result)
elif v.get() == 2:
result = str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))+','+str(int(End_x*XRadioVar))+','+str(int(End_y*YRadioVar))+','+str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))
Coordinate.set(str(result))
if v1.get() == 1:
pyperclip.copy(result)
canvas.update()
以下是鼠标右键按下滑动事件调用的回调函数代码
def B3_Motion(event):
global End_x
global End_y
radioup , raduodown = vertibar.get()
radioxleft , radioxright = horibar.get()
#End_x,End_y = ((canvas.canvasx(event.x)+width * radioxleft)-2 ), ((canvas.canvasx(event.y) + high * radioup)-2) #-2才是对上像素
End_x,End_y = ((event.x+width * radioxleft)-2 ), ((event.y + high * radioup)-2) #-2才是对上像素
if End_x<0 :
End_x = 0;
if End_y <0:
End_y = 0;
if End_x > width :
End_x = width;
if End_y > high:
End_y = high;
canvas.delete(tk.rectangle1)
tk.rectangle1 = canvas.create_rectangle(Start_x+2, Start_y+2 , End_x +2, End_y +2, outline = "red")#矫正显示矩形刚好对上光标
result = str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))+','+str(int(End_x*XRadioVar))+','+str(int(End_y*YRadioVar))+','+str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))
Coordinate.set(str(result))
if v1.get() == 1:
pyperclip.copy(result)
'''canvas.src_strlist = canvas.imagecolor.load()
R,G,B = canvas.src_strlist[End_x, End_y]
px = str(hex((R>>3)<<11 | (G>>2)<<5 | B>>3))
Coordinate.set(px)
print(px)'''
canvas.update()
以下是鼠标左键按下事件调用的回调函数代码
def Mouse_dowm(event):
global Start_x
global Start_y
radioup , raduodown = vertibar.get()
radioxleft , radioxright = horibar.get()
Start_x,Start_y = ((event.x+width * radioxleft)-2 ), ((event.y + high * radioup)-2)
#canvas.create_oval(x1 , y1, x2, y2, fill = "red")
if Start_x<0 :
Start_x = 0;
if Start_y <0:
Start_y = 0;
if Start_x > width :
Start_x = width;
if Start_y > high:
Start_y = high;
result = str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))
if v.get() == 3 or v.get() == 5:
Coordinate.set(str(result))
if v1.get() == 1:
pyperclip.copy(result)
elif v.get() == 4 :
if Start_x>3)<<11 | (G>>2)<<5 | B>>3))
Coordinate.set(px)
if v1.get() == 1:
pyperclip.copy(px)
canvas.update()
以下是鼠标滚轮键按下事件调用的回调函数代码
def Mouse_Middle_dowm(event):
global Start_x
global Start_y
radioup , raduodown = vertibar.get()
radioxleft , radioxright = horibar.get()
Start_x,Start_y = ((event.x+width * radioxleft)-2 ), ((event.y + high * radioup)-2)
#canvas.create_oval(x1 , y1, x2, y2, fill = "red")
if Start_x<0 :
Start_x = 0;
if Start_y <0:
Start_y = 0;
if Start_x > width :
Start_x = width;
if Start_y > high:
Start_y = high;
if Start_x>3)<<11 | (G>>2)<<5 | B>>3))
Coordinate.set(px)
if v1.get() == 1:
pyperclip.copy(px)
canvas.update()
以下是鼠标右键按下事件调用的回调函数代码
def Mouse_RIGHT_dowm(event):
global Start_x
global Start_y
radioup , raduodown = vertibar.get()
radioxleft , radioxright = horibar.get()
Start_x,Start_y = ((event.x+width * radioxleft)-2 ), ((event.y + high * radioup)-2)
#canvas.create_oval(x1 , y1, x2, y2, fill = "red")
if Start_x<0 :
Start_x = 0;
if Start_y <0:
Start_y = 0;
if Start_x> width :
Start_x = width;
if Start_y > high:
Start_y = high;
result = str(int(Start_x*XRadioVar))+','+str(int(Start_y*YRadioVar))
Coordinate.set(str(result))
canvas.update()
以下是打开图片路径并读取调用的回调函数代码
def OpenPicture():
global high
global width
global R
global G
global B
global px
#canvas.delete(tk.canvasimage)
get_fp = filedialog.askopenfilename(filetypes = [("BMP",".bmp"),("PNG",".png"), ("GIF",".gif"),("JPG",".jpg")])
image = Image.open(get_fp)
ws.title('Guides QQ:1257784610 '+str(get_fp))
#获取图片像素点大小
high = image.height #高度
width = image.width #宽度
#canvas.delete("all")
#print(high,width)
if (high%2) != 0:
high = high-1
if (width%2) != 0:
width = width-1
canvas.img_avatar = ImageTk.PhotoImage(image)
canvas.imagecolor = image.convert('RGB')
canvas.config(
width=100,
height=100,
scrollregion=(2,2,width+3,high+3) ) # 2改为0会导致光标和画布有点偏移,取消滚动功能就正常 ,此为画布元祖坐标,这里重定画布大小)
tk.canvasimage = canvas.create_image(float(width/2)+2,float(high/2)+2 , image=canvas.img_avatar ) #此处加2是为了全部显示
#canvas.after(image=photo)
#canvas.configure(image = photo)
canvas.itemconfig(tk.canvasimage, image=canvas.img_avatar)
canvas.update()
return
以下是XY坐标按键系数调用回调函数代码
def XYRadio_Set():
global YRadioVar
global XRadioVar
XRadioVar = float(X_Radio.get())
YRadioVar = float(Y_Radio.get())