[Python] ColorSame2

项目介绍

  • 项目名称: ColorSame2
  • 项目功能: 实时反馈当前光标处像素颜色最接近哪种中国颜色,并计算相似度。

功能展示

把光标移到红色涂鸦上时
把光标移到绿色涂鸦上时把光标移到深蓝色涂鸦上时

部分代码

  • pickle文件[1]
"曲红": (240, 90, 70)
"谷鞘红": (241, 118, 102)
"苹果红": (241, 86, 66)
"桂红": (242, 90, 71)
"粉红": (242, 185, 178)
"暗驼棕": (89, 38, 32)
"夕阳红": (222, 42, 24)
"樱桃红": (237, 51, 33)
"珊瑚红": (240, 74, 58)
"火山棕": (72, 37, 34)
"栗棕": (92, 30, 25)
"鹤顶红": (212, 37, 23)
"舌红": (241, 151, 144)
"鹅血石红": (171, 55, 47)
"酱棕": (90, 31, 27)
"鱼鳃红": (237, 59, 47)
"芦穗灰": (189, 174, 173)
"丽春红": (235, 38, 26)
"覆盆子红": (172, 31, 24)
"海报灰": (72, 51, 50)
"豆沙": (72, 30, 28)
"榴子红": (241, 144, 140)
"秋海棠红": (236, 43, 36)
"无花果红": (239, 175, 173)
"淡绯": (242, 202, 201)
"玫瑰灰": (75, 46, 43)
"淡菽红": (237, 72, 69)
"枸枢红": (237, 51, 51)
"貂紫": (93, 49, 49)
  • 主要代码
# 不作为单独程序使用
import pickle  # 储存数据用
import re
import tkinter as tk  # 设置窗口用
import pyautogui  # 读取光标颜色用
import self_code  # 自建软件包,非核心代码


# 将颜色color的RGB值转成十六进制表示法所表示的颜色
def change_color(color):
    color_changed = []
    change_color_str = ''  # 储存转后的十六进制表示法的结果
    for item in range(3):
        color_changed.append(format(color[item], 'x').zfill(2))
        change_color_str = change_color_str + color_changed[item]
    return change_color_str.upper()  # 使用大写
    pass


# 拿出一个颜色color和字典color_dict里的所有颜色进行对比
# color_dict来自pickle文件
def same(color, color_dict):
    i_dict = {}  # 为了储存所有的对比结果
    for item in color_dict:
        a = [0, 0, 0]
        a[0] = (abs(color[0] - color_dict[item][0]))  # 对比两个颜色的R值
        a[1] = (abs(color[1] - color_dict[item][1]))  # 对比两个颜色的G值
        a[2] = (abs(color[2] - color_dict[item][2]))  # 对比两个颜色的B值
        i_dict[item] = sum(a)  # 计算R、G、B三值差值的总和
    result_min = min(i_dict, key=lambda x: i_dict[x])  # 从所有对比结果中选出差距最小的
    num_color = change_color(color_dict[result_min])  # 将最相似的颜色RGB值转成十六进制表示法
    return f'{result_min},%.2f%%,#{num_color}' % (100 - (i_dict[result_min] / 7.65))
    pass


def run():  # 运行部分
    """
    读取目前光标的位置,和颜色字典保留的颜色对比
    :return:
    """
    now_pos = pyautogui.position()  # 获取光标位置
    # print('当前位置{}'.format(now_pos))
    number = re.findall('\\d+', str(now_pos))  # 获取的位置的x,y值
    color = pyautogui.pixel(int(number[0]), int(number[1]))  # 获取指定x,y值位置处像色的颜色
    with open('color.pickle', 'rb') as color_file:  # 打开pickle文件获取使用的字典color_file
        color_info = pickle.load(color_file)
        get_same = same(color, color_info)
        # print('当前色值{}'.format(color))
    color = change_color(color)
    get_same = get_same + ',#' + color
    return get_same


def f5():  # 每500ms,刷新数据
    var_all = run().split(',')
    now_color.set(var_all[3])
    dict_color.set(var_all[2])
    dict_color_name.set('对应色:%s' % var_all[0])
    var_same.set(var_all[1])
    now_bg.config(bg=now_color.get())
    dict_bg.config(bg=dict_color.get())
    window.after(500, f5)
    pass


# 窗口建立部分,并非核心代码
window = tk.Tk()

# 此功能来自自建软件包self_code
# 打开window窗口,命名为‘ColorSame2’,设置宽350,高220
self_code.mid_open(window, 'ColorSame2', 350, 220)

frm = tk.Frame()
frm.pack()
frm_l = tk.Frame(frm)
frm_l.pack(side='left')
frm_r = tk.Frame(frm)
frm_r.pack(side='right')

tk.Label(frm_l, text='鼠标位置的颜色').pack()
now_color = tk.StringVar()
now_color.set('#FFFFFF')
dict_color = tk.StringVar()  # 2
dict_color.set('#FFFFFF')
dict_color_name = tk.StringVar()  # 0
var_same = tk.StringVar()  # 1
now_bg = tk.Label(frm_l, bg=now_color.get(), width=18, height=5)
now_bg.pack()
tk.Label(frm_l, textvariable=now_color).pack()
tk.Label(frm_r, textvariable=dict_color_name).pack()
dict_bg = tk.Label(frm_r, bg=dict_color.get(), width=18, height=5)
dict_bg.pack()
tk.Label(frm_r, textvariable=dict_color).pack()
tk.Label(text='相似度').pack()
tk.Label(textvariable=var_same).pack()
window.after(500, f5)
window.mainloop()


理论基础

  • 颜色相似度的计算方法:
    ColorA,RGB:(a1, a2, a3)
    ColorB,RGB:(b1, b2, b3)
    ColorA与ColorB两种颜色的相似度为:{1-[(|a1-b1|+|a2-b2|+|a3-b3|)÷765]}×100%
    举例:
    同种颜色的相似度为100%;
    白色(255, 255, 255)&白色(255, 255, 255):{1-[(|255-255|+|255-255|+|255-255|)÷765]}×100%=100%
    白色(255, 255, 255)&黑色(0, 0, 0):{1-[(|255-0|+|255-0|+|255-0|)÷765]}×100%=0%

数据来源

[1] 中国色(http://zhongguose.com)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值