项目介绍
- 项目名称: 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)