基于Python实现屏幕取色工具

 更新时间:2024年12月30日 09:08:00   作者:hvinsion  
屏幕取色小工具‌是一种实用的软件工具,主要用于从屏幕上精确获取颜色值,非常适合设计、编程等需要精确配色的领域,下面我们看看如何利用Python编写一个屏幕取色工具吧

1.简介

屏幕取色小工具‌是一种实用的软件工具,主要用于从屏幕上精确获取颜色值,非常适合设计、编程等需要精确配色的领域。这类工具通常能够从屏幕上任何区域精确提取颜色值,支持在整数值、RGB值、BGR值之间转换‌。资源已打包成exe文件,大家需要可自行下载,喜欢请点个关注,主页还有更多干货资源!

2.运行效果

3.相关源码

from ctypes import windll
import cv2
from numpy import array as arr
from win32api import GetCursorPos, SetCursorPos
import wx
from PIL import ImageGrab
 
 
class colorData:
    def __init__(self, pos=None, color=None, rgb=None):
        self.pos = pos
        self.color = color
        self.rgb = rgb
 
 
class ColorFrame(wx.Dialog):
    def __init__(self):
        windll.user32.SetProcessDPIAware()
        super().__init__(None, title='Desktop Color', size=(200, 300))
        self.panel = wx.Panel(self)
        self.zb = wx.StaticText(self.panel, label='坐标:(0, 0, 0)', style=wx.ALIGN_CENTER)
        self.ys = wx.StaticText(self.panel, label='颜色:(0, 0, 0)', style=wx.ALIGN_CENTER)
        self.RGB = wx.StaticText(self.panel, label='RGB:(0, 0, 0)', style=wx.ALIGN_CENTER)
        self.bitmap = wx.StaticBitmap(self.panel, size=(200, 200))
        self.data = colorData()
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.zb, proportion=1, flag=wx.EXPAND)
        sizer.Add(self.ys, proportion=1, flag=wx.EXPAND)
        sizer.Add(self.RGB, proportion=1, flag=wx.EXPAND)
        sizer.Add(self.bitmap, proportion=1, flag=wx.EXPAND | wx.ALL)
        self.panel.SetSizer(sizer)
        self.Bind(wx.EVT_CLOSE, self.on_close)
        self.Bind(wx.EVT_CHAR_HOOK, self.on_key_press)
        # 创建一个定时器来定期获取桌面颜色并更新标签
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_timer, self.timer)
        self.timer.Start(1)  # 每隔1秒触发一次定时器
 
    def on_timer(self, event):
        point = GetCursorPos()
        screenshot = ImageGrab.grab()
        color = screenshot.getpixel(point)
        img = arr(ImageGrab.grab((point[0] - 10, point[1] - 10, point[0] + 10, point[1] + 10)))
        img = cv2.resize(img, None, None, fx=10, fy=10, interpolation=cv2.INTER_AREA)
        cv2.rectangle(img, (100, 100), (110, 110), (255, 0, 0), 1)
        self.update_label(point, color, img)
 
    def update_label(self, point, color, img):
        self.zb.SetLabel(f'坐标:({point[0]}, {point[1]})')
        self.ys.SetLabel(f'颜色:({color[0]}, {color[1]}, {color[2]})')
        self.RGB.SetLabel(f'RGB:({color[0]:02X}{color[1]:02X}{color[2]:02X})')
        height, width, _ = img.shape
        self.maps = wx.Bitmap.FromBuffer(width, height, img)  # 将Opencv图像转换为wxPython图像对象
        self.bitmap.SetBitmap(self.maps)
 
    def on_close(self, event):
        self.timer.Stop()
        self.Destroy()
 
    def on_key_press(self, event):
        keycode = event.GetKeyCode()
        point = GetCursorPos()
        if keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER:
            screenshot = ImageGrab.grab()
            color = screenshot.getpixel(point)
            self.data.pos = point
            self.data.color = color
            self.data.rgb = f'{color[0]:02X}{color[1]:02X}{color[2]:02X}'
            self.on_close(event)
            # self.EndModal(wx.ID_OK)
        elif keycode == wx.WXK_LEFT:
            SetCursorPos((point[0] - 1, point[1]))
        elif keycode == wx.WXK_RIGHT:
            SetCursorPos((point[0] + 1, point[1]))
        elif keycode == wx.WXK_UP:
            SetCursorPos((point[0], point[1] - 1))
        elif keycode == wx.WXK_DOWN:
            SetCursorPos((point[0], point[1] + 1))
 
    def get_data(self):
        return self.data
 
 
app = wx.App()
frame = ColorFrame()
frame.Show()
app.MainLoop()
print(frame.data.pos, frame.data.color, frame.data.rgb)

到此这篇关于基于Python实现屏幕取色工具的文章就介绍到这了,更多相关Python屏幕取色内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中协程间通信的方式小结

    Python中协程间通信的方式小结

    Python中协程间的通信方式包括asyncio.Queue、asyncio.Event、asyncio.Condition、asyncio.Semaphore、asyncio.Streams和asyncio.Future,感兴趣的可以了解一下
    2025-01-01
  • Python中浏览器有头和无头操作的实战指南

    Python中浏览器有头和无头操作的实战指南

    有头模式就是我们在日常使用浏览器时最常见的形式,无头模式是指浏览器在没有图形用户界面(GUI)的环境下运行,下面小编就和大家详细介绍一下二者的区别并给出Python示例代码,感兴趣的小伙伴可以了解下
    2026-03-03
  • 推荐Python小白理想的IDE编辑器thonny

    推荐Python小白理想的IDE编辑器thonny

    这篇文章主要为大家介绍了推荐一款Python编辑器thonny,非常适合Python使用,具体原因文中给出详细说明,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Django model重写save方法及update踩坑详解

    Django model重写save方法及update踩坑详解

    这篇文章主要介绍了Django model重写save方法及update踩坑详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 基于Python实现自动化文件管理(分类、重命名和备份)

    基于Python实现自动化文件管理(分类、重命名和备份)

    在数字化时代,我们每天都会创建和处理大量的文件,自动化文件管理通过编程方式处理这些繁琐任务,可以为我们带来显著的效率提升,下面我们就来看看如何使用Python进行文件分类,重命名和备份吧
    2025-10-10
  • 使用Python进行GRPC和Dubbo协议的高级测试

    使用Python进行GRPC和Dubbo协议的高级测试

    GRPC(Google Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服务框架,常用于构建大规模的微服务架构,本文我们就来看看如何使用Python对二者进行测试吧
    2025-06-06
  • OpenCV半小时掌握基本操作之角点检测

    OpenCV半小时掌握基本操作之角点检测

    这篇文章主要介绍了OpenCV基本操作之角点检测,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python特殊属性property原理及使用方法解析

    Python特殊属性property原理及使用方法解析

    这篇文章主要介绍了Python特殊属性property原理及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • PyTorch中torch.tensor与torch.Tensor的区别详解

    PyTorch中torch.tensor与torch.Tensor的区别详解

    这篇文章主要介绍了PyTorch中torch.tensor与torch.Tensor的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • python监控网卡流量并使用graphite绘图的示例

    python监控网卡流量并使用graphite绘图的示例

    这篇文章主要介绍了python监控网卡流量并使用graphite绘图的示例,需要的朋友可以参考下
    2014-04-04

最新评论