图片像素点坐标提取软件/图片坐标点提取软件/图片坐标点获取/Python提取图片坐标/Pyhton坐标获取工具/Python图片坐标获取源码/tkinter图片处理/tkinter画布与滚动条

该软件使用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文库

 通过此处可修改图片像素点坐标提取软件/图片坐标点提取软件/图片坐标点获取/Python提取图片坐标/Pyhton坐标获取工具/Python图片坐标获取源码/tkinter图片处理/tkinter画布与滚动条_第1张图片打开的图片格式

图片像素点坐标提取软件/图片坐标点提取软件/图片坐标点获取/Python提取图片坐标/Pyhton坐标获取工具/Python图片坐标获取源码/tkinter图片处理/tkinter画布与滚动条_第2张图片

自动获取功能:

鼠标左键单击:        单点坐标
鼠标左键按下移动:    按键坐标
鼠标滚轮单击:        像素颜色
鼠标右键按下并移动:    切图坐标

按键坐标就是一个矩形坐标:(左上角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

把自动获取取消后,单击就是对应的坐标

图片像素点坐标提取软件/图片坐标点提取软件/图片坐标点获取/Python提取图片坐标/Pyhton坐标获取工具/Python图片坐标获取源码/tkinter图片处理/tkinter画布与滚动条_第3张图片

下面的都是源码(旧源码),但是由于时间仓促并没有对代码进行整理,不然的话可以更简洁,由于工作使用的都是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())

你可能感兴趣的:(Python,图片坐标提取,python,单片机,stm32,arm,图像处理)