前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python: 屏幕取色器(识别屏幕上不同位置的颜色)

Python: 屏幕取色器(识别屏幕上不同位置的颜色)

作者头像
Exploring
发布于 2022-09-20 06:04:23
发布于 2022-09-20 06:04:23
5.2K00
代码可运行
举报
运行总次数:0
代码可运行

文章背景:工作中,有时候需要判断图片中不同位置的颜色。有些颜色不太容易区分,所以想通过Python编写代码,通过屏幕取点,获取某个位置的颜色值。

代码逻辑:

(1)文末参考资料[2]的csv文件(记为颜色表)中给出了865种颜色的英文名称和对应的RGB数值,在此基础上,笔者添加了相应的中文名称,如下表所示。

(2)通过鼠标在屏幕上取点,获取指定位置的RGB数值,然后与颜色表中各行的RGB数值进行匹配,返回RGB数值最接近的颜色信息。

Python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Python实现屏幕取色器功能
# adapted form https://mp.weixin.qq.com/s/S_FNIqtqdvlEgplM7UuvNg

import os
import pandas as pd
from time import sleep
from PIL import ImageGrab, Image

import uuid
import pyperclip

import tkinter
import tkinter.messagebox

def get_color_name(r, g, b, csv_df):
    # 基于给定的R,G,B和颜色表,匹配与所取点RGB数值最接近的颜色。
    
    min_diff = 10000
    color = ["" for i in range(6)]

    for i in range(len(csv_df)):
        d = abs(r - int(csv_df.loc[i, "R"])) + abs(g - int(csv_df.loc[i, "G"]))+ abs(b - int(csv_df.loc[i, "B"]))
        
        if d <= min_diff:
            min_diff = d
            color[0] = csv_df.loc[i,"color_name"]
            color[1] = csv_df.loc[i,"color_Chi"]
            color[2] = str(int(csv_df.loc[i, "R"]))
            color[3] = str(int(csv_df.loc[i, "G"]))
            color[4] = str(int(csv_df.loc[i, "B"]))
            color[5] = csv_df.loc[i, "hex"]
            
    return color

class MyCapture(object):
    # 处理全屏截图

    def __init__(self, png,root,csv_df):

        # 获取屏幕尺寸
        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()

        # 创建顶级组件容器,与屏幕尺寸一样大
        self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)

        # 不显示最大化、最小化按钮
        self.top.overrideredirect(True)
        
        # create a new PhotoImage object
        self.image = tkinter.PhotoImage(file=png)

        # 创建画布
        self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)

        # 显示全屏截图
        self.canvas.create_image(screenWidth//2, screenHeight//2, anchor = tkinter.CENTER, image=self.image)

        # 获取鼠标左键抬起的位置,取色
        def onLeftButtonUp(event):

            im = Image.open(png)
            
            # retrieves the red, green, blue (RGB) color value of the pixel at the specified coordinates
            color = im.getpixel((event.x, event.y))
            
            temp = [str(item) for item in color]
            RGB = "取点的RGB数值:" + ", ".join(temp) + "\n\n"
            
            R,G,B = color
            
            color = get_color_name(R,G,B,csv_df)
            
            color_RGB = "RGB数值:" + ", ".join(color[2:5]) + "\n"
            color_hex = "十六进制值:" + color[5] + "\n"
            color_Eng = "英文名称:" + color[0] + "\n"
            color_Chi = "中文名称:" + color[1] + "\n\n"
            
            msg = "中文名称已复制到剪切板!"
            
            tkinter.messagebox.showinfo('结果展示', RGB + color_RGB + color_hex + color_Eng + color_Chi + msg)
            
            pyperclip.copy(color[1])

            # 关闭Toplevel窗口对象
            self.top.destroy()

        self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
        self.canvas.pack(fill=tkinter.BOTH, expand=True)


def buttonCaptureClick(root,buttonCapture,csv_df):
    # 截图

    # 最小化主窗口
    root.state('icon')

    sleep(0.2)
    
    # 获取临时文件名        
    filename = uuid.uuid4().hex + ".png"
    
    # 拍摄屏幕全屏,Windows上以RGB图像的形式返回。
    im = ImageGrab.grab()
    
    im.save(filename)
    im.close()

    # 显示全屏幕截图
    w = MyCapture(filename,root,csv_df)
    
    # wait_window seems to not return until the given widget passed as parameter is not destroyed.
    buttonCapture.wait_window(w.top)

    # 截图结束,恢复主窗口,并删除临时的全屏幕截图文件
    root.state('normal')
    os.remove(filename)

def main():
    
    # 获取颜色数据表
    index = ["color", "color_name","hex", "color_Chi","R", "G", "B"]
    csv_df = pd.read_csv('colors.csv', names=index, header=None, encoding='chinese')
    
    # 窗口
    root = tkinter.Tk()
    root.title("颜色识别器v2")
    
    # 窗口宽250,高60; 左上角坐标:(400300)
    root.geometry('250x60+400+300')
    
    #不可更改窗口大小
    # root.resizable(False, False)
    
    buttonCapture = tkinter.Button(root, text='取色',width=6,command=lambda:buttonCaptureClick(root,buttonCapture,csv_df))
    buttonExit = tkinter.Button(root, text='退出',width=6,command=root.destroy)
    
    buttonCapture.grid(row=0,column=0,padx = 40,pady =10)
    buttonExit.grid(row=0,column=1,padx = 40,pady =10)

    #启动消息主循环
    root.mainloop()

if __name__ == '__main__':
    main()

效果演示:

http://mpvideo.qpic.cn/0bc3taaakaaazyaaitishjrfbggdawmaabia.f10002.mp4?dis_k=80bd5645282a6971b746f16b2da516eb&dis_t=1663653830&vid=wxv_2277589062624641024&format_id=10002&support_redirect=0&mmversion=false

参考资料:

[1] Python实现屏幕取色器功能

[2] color-names(https://github.com/codebrainz/color-names/blob/master/output/colors.csv)

[3] 基于Python的颜色识别器(https://zhuanlan.zhihu.com/p/342372391)

[4] Python PIL ImageGrab.grab()用法及代码示例(https://vimsky.com/examples/usage/pyhton-pil-imagegrab-grab-method.html)

[5] 如何让tkinter窗口最小化(https://www.pynote.net/archives/1352)

[6] What does the"wait_window" method do(https://stackoverflow.com/questions/28388346/what-does-thewait-window-method-do)

[7] Tkinter PhotoImage(https://www.pythontutorial.net/tkinter/tkinter-photoimage/)

[8] Canvas image objects(https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/create_image.html)

[9] Python PIL | getpixel() Method(https://www.geeksforgeeks.org/python-pil-getpixel-method/)

[10] Python GUI设计:tkinter菜鸟编程(https://item.jd.com/12667860.html)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!
最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了…
Android技术干货分享
2020/10/13
1.6K0
面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!
Android三非实习面筋:3轮面试,终与字节无缘,结束了,被焦虑支配的120天...
就在前几天6月28日,询问 hr 后,字节三面没有通过,我的找实习之路也结束了,从3月1日开始投递简历到6月28日,算算日子正好 120 天,我也终于结束这被焦虑的支配的时光,这一路走下来,我也就剩下这篇面试面经了,记录着我的心酸泪啊...
Android技术干货分享
2021/07/02
1.4K0
Android三非实习面筋:3轮面试,终与字节无缘,结束了,被焦虑支配的120天...
45天拿下字节跳动Android研发岗offer,竟然有个面试真题库,内幕首次公开!
然后在某个下午,我欢乐地在一个群里进行技术交流(其实也就是划水),突然有个大佬发出个字节跳动的内推。
Android技术干货分享
2020/11/19
1.2K0
45天拿下字节跳动Android研发岗offer,竟然有个面试真题库,内幕首次公开!
Android:双非大二3轮技术面+HR面,过关斩将收割字节头条客户端offer
算法:[82. 删除排序链表中的重复元素 II](javascript:void(0);)
Android技术干货分享
2021/06/08
1.2K0
Android:双非大二3轮技术面+HR面,过关斩将收割字节头条客户端offer
字节跳动Android客户端实习 3+1 面经,内部面试官透露通关秘籍
我是一名本科应届生,学校专业是软件开发。距离毕业之期不到半年,学校也在催促我们早点出校实习,年前通过一名学长内推去了字节跳动的抖音面试。12 月 31 号投的简历,1 月 6 号收到 HR 电话。隔这么长时间还是挺害怕的,以为简历都被筛掉了。
Android技术干货分享
2021/08/11
1.7K0
字节跳动Android客户端实习 3+1 面经,内部面试官透露通关秘籍
秋招真实记录:紧张的337小时,我终于等来了字节跳动offer(Android岗)
坐标北京,某211本科毕业生,之前学校活动有去过字节跳动公司总部参观,所以一直以来就蛮想进入字节工作的,被字节的企业文化和工作氛围所影响。字节作为发展速度最快的互联网公司,旗下的很多产品的用户都比肩BAT了,所以自己也算是字节的死忠粉了。
Android技术干货分享
2020/11/20
7680
秋招真实记录:紧张的337小时,我终于等来了字节跳动offer(Android岗)
2020Android面试心得:斩获3个大厂offer后,大厂常考知识点&面试技巧出炉,等你来拿!
历时一个半月,斩获3个大厂offer(京东、新浪、滴滴),这里进行下简单的总结,希望能帮助到大家。
Android技术干货分享
2021/01/27
5230
2020Android面试心得:斩获3个大厂offer后,大厂常考知识点&面试技巧出炉,等你来拿!
研究实习生历时2个月成功拿到字节&腾讯Android岗offer,应届小白看这个指南就够了!
本人本硕985软件工程,17年毕业后在TP-Link做过接近一年的安卓开发,后来才辞职考研回母校继续提升自我。原本是打算找一份算法的实习,但今年算法岗的形势不容乐观,竞争激烈。所以在2月初决定把重心放在开发上,做自己喜欢的安卓,然后就开始投递简历了。
Android技术干货分享
2021/04/25
1.2K0
研究实习生历时2个月成功拿到字节&腾讯Android岗offer,应届小白看这个指南就够了!
公司主业务线转移后悔没拿 N+1 走,离职后面试收割小米,字节跳动Android研发岗Offer
先简单说说我最近的面试经历吧。面试的公司很多,其中有让我心血沸腾的经历,也有让我感到失望到无助的经历,我将这些体会都记录下来,细想之后很值得,面了这么多公司,要是最后什么也没有留下来,那就太浪费了。至少对于我来说有些东西在整理总结之后才能得到一个肯定的答案。希望这些能对即将换工作或者打算看看机会的你有一些帮助。
Android技术干货分享
2020/08/04
7390
公司主业务线转移后悔没拿 N+1 走,离职后面试收割小米,字节跳动Android研发岗Offer
【大厂诀窍】:Android开发3年每天CRUD,这样系统复习2个月后幸运拿下美团offer!
当时刚过完年回到上海,此时的我已经毕业两年半了,和大多数咸鱼一样,上班就是CRUD,下班就是看剧、玩游戏(英雄联盟、手游都玩)。
Android技术干货分享
2020/12/23
6090
【大厂诀窍】:Android开发3年每天CRUD,这样系统复习2个月后幸运拿下美团offer!
如何准备大厂面试?如何变的更强?我咨询了身边的技术专家之后终于得到答案!
文章内容适用于每一个学习 Android 的朋友!我觉得这篇文章的很多东西也是我自己写给自己看的,比如从大厂招聘要求中我们能看到哪些重要的能力,我们该朝什么方向努力?共勉!
Android技术干货分享
2020/03/17
5620
如何准备大厂面试?如何变的更强?我咨询了身边的技术专家之后终于得到答案!
Android大三提前批的钉钉和抖音面筋,阿里挂了HR面,抖音通过收获Offer
这一次的话,主要就是只投了钉钉和抖音两个部门,然后为了保险起见,让指导老师给我推荐了一个小公司,因为实在太想实习了,想着如果面试不上,总要有一个保底的机会。当然那家公司也挺nice的,我跟老总说了来意之后,老总直说让我全力冲,位置给我留着,所以在这里非常感谢吴总您对我的支持。
Android技术干货分享
2020/10/19
6340
Android大三提前批的钉钉和抖音面筋,阿里挂了HR面,抖音通过收获Offer
这都没挂,2021字节跳动的Android研发岗也太好进了吧?(万字面经+经验分享)
本人基本情况是:16年毕业于211院校本科,19-21年在oppo工作,算是有大厂经验了,面试的岗位是Android应用开发工程师。
Android技术干货分享
2021/07/12
1.3K0
这都没挂,2021字节跳动的Android研发岗也太好进了吧?(万字面经+经验分享)
Android大厂面试官全套教程教你:这样准备面试顺利拿到offer!
没错,我前段时间又出去面试了,我有个同事跟我说过:他曾经的老大告诉他们,无论是否跳槽,每年都应该出去面试一下。我个人对这个想法持支持态度,至少在我们还年轻的时候应该尽量这么做,当然我自己也做不到哈哈。
Android技术干货分享
2021/05/13
5520
Android大厂面试官全套教程教你:这样准备面试顺利拿到offer!
Android 开发网易面试凉凉经,面试官:基础不牢,技术不够深入,无缘offer
网易的面试结果已经出来好几天了,一直拖着不是很想写面经,反正这会儿闲着无聊,又总是要写的(一来呢是当做一种记录吧,二来呢留给自己和需要的人看,好有个方向)就这会儿写了吧...
Android技术干货分享
2021/06/02
1.4K0
Android 开发网易面试凉凉经,面试官:基础不牢,技术不够深入,无缘offer
2021金三银四想进大厂的要开始准备了,字节跳动Android高频面试题解析!
今年Android开发的整体招聘趋势可以概括为几句话:赛道中的公司在蒙眼狂奔,成熟业务借机补强,更多公司在观望。
Android技术干货分享
2021/01/22
4760
2021金三银四想进大厂的要开始准备了,字节跳动Android高频面试题解析!
面试碰壁如何力挽狂澜,不用眼红“他们”,有了这份Android指南你也可以有绿色通道!
疫情之下,各个企业都在缩小招聘需求,但近 30% 的互联网企业却逆袭扩招,给出的薪资也一个比一个高。这对程序员群体来说,无疑是一个好机会。
Android技术干货分享
2021/03/08
4090
面试碰壁如何力挽狂澜,不用眼红“他们”,有了这份Android指南你也可以有绿色通道!
从外包到大厂的逆袭!安卓开发5年,一年蛰伏后面试成offer收割机,入职腾讯定薪20*15
14年刚毕业的时候,Android开发市场发展火热,无数人员涌入Anroid开发行业,人员增长率快,自然市场竞争力就大。当因为学历不高、职业技能不熟悉再加上没经历过项目实战,导致我的简历,大小公司拒收,最后只能来到了一家外包公司。
Android技术干货分享
2021/06/30
1.1K1
从外包到大厂的逆袭!安卓开发5年,一年蛰伏后面试成offer收割机,入职腾讯定薪20*15
Android面试官感悟:年后跳槽季,这6大技巧教你在面试中大获成功挤入一线互联网大厂!
跳槽,这在 IT 互联网圈是非常普遍的,也是让自己升职加薪,走上人生巅峰的重要方式。那么作为一个普通的Android程序猿,我们如何才能斩获大厂offer 呢?
Android技术干货分享
2021/02/22
4810
Android面试官感悟:年后跳槽季,这6大技巧教你在面试中大获成功挤入一线互联网大厂!
【Android实习面筋】双非本科,1个半月20场面试斩获4家大厂offer,我学会的一些技能
先说一下笔者春招实习的情况:从三月初到四月半,经历了近20场面试,一共面试了五家企业,通过了腾讯、字节、蚂蚁、美团的面试,虎牙在一面之后拒了二面邀请。
Android技术干货分享
2021/04/29
6130
【Android实习面筋】双非本科,1个半月20场面试斩获4家大厂offer,我学会的一些技能
推荐阅读
面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!
1.6K0
Android三非实习面筋:3轮面试,终与字节无缘,结束了,被焦虑支配的120天...
1.4K0
45天拿下字节跳动Android研发岗offer,竟然有个面试真题库,内幕首次公开!
1.2K0
Android:双非大二3轮技术面+HR面,过关斩将收割字节头条客户端offer
1.2K0
字节跳动Android客户端实习 3+1 面经,内部面试官透露通关秘籍
1.7K0
秋招真实记录:紧张的337小时,我终于等来了字节跳动offer(Android岗)
7680
2020Android面试心得:斩获3个大厂offer后,大厂常考知识点&面试技巧出炉,等你来拿!
5230
研究实习生历时2个月成功拿到字节&腾讯Android岗offer,应届小白看这个指南就够了!
1.2K0
公司主业务线转移后悔没拿 N+1 走,离职后面试收割小米,字节跳动Android研发岗Offer
7390
【大厂诀窍】:Android开发3年每天CRUD,这样系统复习2个月后幸运拿下美团offer!
6090
如何准备大厂面试?如何变的更强?我咨询了身边的技术专家之后终于得到答案!
5620
Android大三提前批的钉钉和抖音面筋,阿里挂了HR面,抖音通过收获Offer
6340
这都没挂,2021字节跳动的Android研发岗也太好进了吧?(万字面经+经验分享)
1.3K0
Android大厂面试官全套教程教你:这样准备面试顺利拿到offer!
5520
Android 开发网易面试凉凉经,面试官:基础不牢,技术不够深入,无缘offer
1.4K0
2021金三银四想进大厂的要开始准备了,字节跳动Android高频面试题解析!
4760
面试碰壁如何力挽狂澜,不用眼红“他们”,有了这份Android指南你也可以有绿色通道!
4090
从外包到大厂的逆袭!安卓开发5年,一年蛰伏后面试成offer收割机,入职腾讯定薪20*15
1.1K1
Android面试官感悟:年后跳槽季,这6大技巧教你在面试中大获成功挤入一线互联网大厂!
4810
【Android实习面筋】双非本科,1个半月20场面试斩获4家大厂offer,我学会的一些技能
6130
相关推荐
面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档