python 获取屏幕颜色,python抓取屏幕一个点的颜色
本文主要介绍如何用Python制作一个简单的屏幕颜色提取器。文章中的样例代码讲解的很详细,对我们学习Python很有帮助。有兴趣的可以试试。
00-1010 1.使用效果2。python包必选3.python提示3.1控件数组3.2控件作为属性3.3如何重置控件颜色3.4部分字符串操作使用3.5鼠标位置像素颜色3.6窗口始终在顶部3.7文本框不允许编辑但允许复制4 .完全码
目录
如下图动画所示,点击颜色拾取按钮后,将鼠标移动到要拾取颜色的位置,等待两秒钟进行颜色拾取:
点击保存颜色按钮,将颜色保存在颜色库区域,如图所示,
!红框里所有的方形元素其实都是按钮,点击后可以获得颜色信息!
信息的格式是:(173,189,163) #ADBDA3 (48,35,189)
1.使用效果
py side 2 pyautoguipyperclipctypes from py side 2。QtWidgets导入QApplication,QWidget,QLineEdit
来自PySide2。QtWidgets导入QLabel,QPushButton
来自PySide2。QtGui导入QIcon,QFont
来自PySide2。QtCore导入
导入系统
sys.path.append( . ))
导入时间
将pyautogui作为pag导入
导入pyperclip
从ctypes导入*
2.所需python包
3.python小技巧
和matlab一样,python的控件也可以组成数组。例如,当我创建一个小的彩色盒子时,我是这样写的:
#保存颜色框
对于(0,2):范围内的I
对于范围(0,10):内的j
store color box=q button(self)
storecolorbox . set geometry((0.04 0.093 * j)*宽度,(0.475 0.07 * I)*高度,0.08 *宽度,0.06 *高度)
store color box . set style sheet(self。SS_Color_Box)
store colorbox . set property( storeId ,i*10 j)
store colorbox . set property( Color , #FFFFFF )
store colorbox . clicked . connect(self . selected store)
self . store list . append(store colorbox)
将每个颜色盒存储在self.storeList的数组中,
比如你想调用第I个色盒,可以这样写:
storeBox=self.storeList[i]
3.1控件数组
将一个控件作为属性分配给另一个控件。
因为我们希望在单击左侧标签时获得相应文本框中的信息:
可以这样写(举个例子):
#创建一个文本框
自我。CB1=QLineEdit(self)
自我。CB1.setText(255,
255,255")
self.CB1.move(0.62*Width,0.03*Height)
self.CB1.resize(0.35*Width,0.065*Height)
self.CB1.setFont(qf)
self.CB1.setStyleSheet(self.SS_Inf_Box)
# 创建标签
self.CL1=QPushButton(self)
self.CL1.setGeometry(0.448*Width,0.025*Height,0.14*Width,0.075*Height)
self.CL1.setStyleSheet(self.SS_Inf_Label)
self.CL1.setText("RGB")
self.CL1.setFont(qf)
self.CL1.setProperty(Children,self.CB1) # 把控件作为属性
self.CL1.clicked.connect(self.copyInf)# 与回调函数相连
然后我的回调函数是这样写的:
def copyInf(self):infLabel=self.sender()
infBox=infLabel.property(Children) # 通过找到属性找到对应控件
pyperclip.copy(infBox.text())
3.3怎样重设控件颜色
还是通过setStyleSheet设置嗷,不过把字符串部分应该放颜色的部分换成了要重设的颜色:
self.mainBox.setStyleSheet("QPushButton{background:"+self.curColor_HEX+";border: 3px solid rgb(150,150,150);border-radius:8px}")
3.4一些用到的字符串操作
字符串字母大写
STR=STR.upper()
字符串去掉空格
例如把(10, 50, 255)变为(10,50,255)
STR=STR.replace(" ", "")
字符串去掉两头括号
例如把(10,50,255)变为10,50,255
STR=STR[1:-1]
3.5鼠标位置像素颜色
如何获得当前鼠标位置像素颜色
import pyautogui as pagfrom ctypes import *
x,y=pag.position()
RGB=get_color(x,y)
# 获取x,y位置像素颜色
def get_color(x, y):
gdi32 = windll.gdi32
user32 = windll.user32
hdc = user32.GetDC(None) # 获取颜色值
pixel = gdi32.GetPixel(hdc, x, y) # 提取RGB值
r = pixel & 0x0000ff
g = (pixel & 0x00ff00) >> 8
b = pixel >> 16
return [r, g, b]
3.6窗口始终置顶
self.setWindowFlags(Qt.WindowStaysOnTopHint)
3.7文本框不允许编辑但允许复制
用setFocusPolicy(Qt.NoFocus),例如程序中:
self.CB1.setFocusPolicy(Qt.NoFocus)self.CB2.setFocusPolicy(Qt.NoFocus)
self.CB3.setFocusPolicy(Qt.NoFocus)
4.完整代码
from PySide2.QtWidgets import QApplication,QWidget,QLineEditfrom PySide2.QtWidgets import QLabel,QPushButton
from PySide2.QtGui import QIcon,QFont
from PySide2.QtCore import Qt
import sys
sys.path.append("...")
import time
import pyautogui as pag
import pyperclip
from ctypes import *
# ===========================================================================================
# 相关函数:
# 获取x,y位置像素颜色
def get_color(x, y):
gdi32 = windll.gdi32
user32 = windll.user32
hdc = user32.GetDC(None) # 获取颜色值
pixel = gdi32.GetPixel(hdc, x, y) # 提取RGB值
r = pixel & 0x0000ff
g = (pixel & 0x00ff00) >> 8
b = pixel >> 16
return [r, g, b]
# HEX转RGB
def hex2rgb(hexcolor):
HEX转RGB
:param hexcolor: int or str
:return: Tuple[int, int, int]
>>> hex2rgb(16777215)
(255, 255, 255)
>>> hex2rgb(0xffffff)
(255, 255, 255)
hexcolor = int(hexcolor, base=16) if isinstance(hexcolor, str) else hexcolor
rgb = ((hexcolor >> 16) & 0xff, (hexcolor >> 8) & 0xff, hexcolor & 0xff)
return rgb
# RGB转HEX
def rgb2hex(r, g, b):
color = "#"
color += str(hex(r)).replace(x,0)[-2:]
color += str(hex(g)).replace(x,0)[-2:]
color += str(hex(b)).replace(x,0)[-2:]
return color
# RGB转HSV
def rgb2hsv(r, g, b):
r, g, b = r/255.0, g/255.0, b/255.0
mx = max(r, g, b)
mn = min(r, g, b)
m = mx-mn
if mx == mn:
h = 0
elif mx == r:
if g >= b:
h = ((g-b)/m)*60
else:
h = ((g-b)/m)*60 + 360
elif mx == g:
h = ((b-r)/m)*60 + 120
elif mx == b:
h = ((r-g)/m)*60 + 240
if mx == 0:
s = 0
else:
s = m/mx
v = mx
H = h / 2
S = s * 255.0
V = v * 255.0
return (round(H), round(S), round(V))
# ===========================================================================================
# 窗口类:
class Window(QWidget):
def __init__(self,Width=450,Height=600):
super().__init__()
self.setWindowTitle("getScreenColor")
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.Width=Width
self.Height=Height
# 样式表
self.SS_bkg_Label="QLabel{background: rgb(220,220,220);color:rgb(62,62,62);border-radius:8px}"
self.SS_Inf_Label="QPushButton{background: rgb(79,148,204);color:rgb(240,240,240);border-radius:8px}"
self.SS_Inf_Box="QLineEdit{border-radius:3px;border: 2px solid rgb(149,179,215);color:rgb(92,92,92)}"
self.SS_Main_Box="QPushButton{background: #FFFFFF;border: 3px solid rgb(150,150,150);border-radius:8px}"
self.SS_Color_Box="QPushButton{background: #FFFFFF;border: 2px solid rgb(150,150,150);border-radius:3px}"
self.SS_btn_1="QPushButton{background: rgb(214,219,233);color:rgb(82,82,82)}"
self.SS_btn_2="QPushButton{background: rgb(225,235,205);color:rgb(82,82,82)}"
self.SS_btn_3="QPushButton{background: rgb(232,191,190);color:rgb(82,82,82)}"
# 该类私有变量或属性
self.defaultColor=[#58827E,#144853,#4C6756,#849E77,#ADBDA3,
#6B1B1E,#A94047,#E05E60,#F8A2AF,#E4CEDB,
#B0A087,#7F877C,#C7C7BB,#D4C7BE,#E3E4DF,
#C63866,#FE676E,#FD8F52,#FFBF73,#FFDCA2,
#7292B8,#769EB8,#B4C5D7,#C5D5EC,#D9E0EA,
#681F71,#7E0D5D,#6E57A5,#B589BE,#C993B7,
#3978A4,#81AAAE,#EBCFC4,#FDB8A8,#E3929B,#7D7294]
self.curBoxId=0
self.curColor_RGB=[255,255,255]
self.curColor_HEX=#FFFFFF
self.curColor_HSV=[0,0,255]
self.storeList=[]
self.defaultList=[]
# 框架构造函数调用
self.setSize()
self.partition()
self.setInfBox()
self.setMainBox()
self.setBtn()
self.setIcon()
self.setColorBox()
# ================================================================================================
# 颜色框回调函数部分:
def selectedMain(self):
tColor_HEX=self.curColor_HEX
tColor_RGB=hex2rgb(0x+tColor_HEX[1:])
tColor_HSV=rgb2hsv(tColor_RGB[0], tColor_RGB[1], tColor_RGB[2])
pyperclip.copy(str(tColor_RGB)+ +tColor_HEX+ +str(tColor_HSV))
print(str(tColor_RGB)+ +tColor_HEX+ +str(tColor_HSV))
def selectedStore(self):
storeBox=self.sender()
tColor_HEX=storeBox.property("Color")
tColor_RGB=hex2rgb(0x+tColor_HEX[1:])
tColor_HSV=rgb2hsv(tColor_RGB[0], tColor_RGB[1], tColor_RGB[2])
pyperclip.copy(str(tColor_RGB)+ +tColor_HEX+ +str(tColor_HSV))
print(str(tColor_RGB)+ +tColor_HEX+ +str(tColor_HSV))
def selectedDefault(self):
defaultBox=self.sender()
tNum=defaultBox.property("defaultId")
tColor_HEX=self.defaultColor[tNum]
tColor_RGB=hex2rgb(0x+tColor_HEX[1:])
tColor_HSV=rgb2hsv(tColor_RGB[0], tColor_RGB[1], tColor_RGB[2])
pyperclip.copy(str(tColor_RGB)+ +tColor_HEX+ +str(tColor_HSV))
print(str(tColor_RGB)+ +tColor_HEX+ +str(tColor_HSV))
# ------------------------------------------------------------------------------------------------
# 颜色信息标签回调
def copyInf(self):
infLabel=self.sender()
infBox=infLabel.property(Children)
pyperclip.copy(infBox.text())
print(infBox.text())
# ------------------------------------------------------------------------------------------------
# 按钮回调函数部分:
def getColor(self):
time.sleep(2)
x,y=pag.position()
self.curColor_RGB=get_color(x,y)
self.curColor_HSV=rgb2hsv(self.curColor_RGB[0], self.curColor_RGB[1], self.curColor_RGB[2])
self.curColor_HEX=rgb2hex(self.curColor_RGB[0], self.curColor_RGB[1], self.curColor_RGB[2]).upper()
RGB_STR=str(self.curColor_RGB).replace(" ", "")[1:-1]
HSV_STR=str(self.curColor_HSV).replace(" ", "")[1:-1]
self.CB1.setText(RGB_STR)
self.CB2.setText(self.curColor_HEX)
self.CB3.setText(HSV_STR)
self.mainBox.setStyleSheet("QPushButton{background:"+self.curColor_HEX
+";border: 3px solid rgb(150,150,150);border-radius:8px}")
def saveColor(self):
if self.curBoxId<20:
tempBox=self.storeList[self.curBoxId]
tempBox.setProperty("Color",self.curColor_HEX)
tempBox.setStyleSheet("QPushButton{background:"+self.curColor_HEX
+";border: 2px solid rgb(150,150,150);border-radius:3px}")
self.curBoxId+=1
def deleteColor(self):
if self.curBoxId>0:
self.curBoxId-=1
tempBox=self.storeList[self.curBoxId]
tempBox.setProperty("Color",#FFFFFF)
tempBox.setStyleSheet(self.SS_Color_Box)
# ================================================================================================
# 框架构造函数部分:
def setSize(self):# 调整框架大小
self.setGeometry(80,80,self.Width,self.Height)
self.setMaximumSize(self.Width,self.Height)
self.setMinimumSize(self.Width,self.Height)
def setIcon(self):# 设置图标
appIcon=QIcon("ICON.ico")
self.setWindowIcon(appIcon)
def partition(self):# 各部分划分
Width=self.Width
Height=self.Height
qf=QFont()
qf.setBold(True)
qf.setPointSize(12)
qf.setFamily("Cambria")
# --part1--当前颜色显示框背景-----
self.bkgLabel1=QLabel(self)
self.bkgLabel1.setGeometry(0.024*Width,0.015*Height,0.4*Width,0.3*Height)
self.bkgLabel1.setStyleSheet(self.SS_bkg_Label)
# --part2--当前颜色信息背景-----
self.bkgLabel2=QLabel(self)
self.bkgLabel2.setGeometry(0.448*Width,0.015*Height,0.528*Width,0.3*Height)
self.bkgLabel2.setStyleSheet("QLabel{background: rgb(235,235,235);border-radius:8px}")
# --part3--颜色存储库背景-----
self.bkgLabel3=QLabel(self)
self.bkgLabel3.setGeometry(0.024*Width,0.41*Height,0.952*Width,0.205*Height)
self.bkgLabel3.setStyleSheet(self.SS_bkg_Label)
self.bkgLabel3_title=QLabel(self)
self.bkgLabel3_title.setGeometry(0.038*Width,0.415*Height,0.4*Width,0.05*Height)
self.bkgLabel3_title.setStyleSheet(self.SS_bkg_Label)
self.bkgLabel3_title.setText("Color Library")
self.bkgLabel3_title.setFont(qf)
# --part4--预设颜色库背景-----
self.bkgLabel4=QLabel(self)
self.bkgLabel4.setGeometry(0.024*Width,0.63*Height,0.952*Width,0.355*Height)
self.bkgLabel4.setStyleSheet(self.SS_bkg_Label)
self.bkgLabel4_title=QLabel(self)
self.bkgLabel4_title.setGeometry(0.038*Width,0.635*Height,0.8*Width,0.05*Height)
self.bkgLabel4_title.setStyleSheet(self.SS_bkg_Label)
self.bkgLabel4_title.setText("Color Library(default)")
self.bkgLabel4_title.setFont(qf)
def setInfBox(self):# 设置信息显示框
Width=self.Width
Height=self.Height
# 字体设置
qf=QFont()
qf.setBold(True)
qf.setPointSize(12)
qf.setFamily("Cambria")
# 绘制颜色信息框
qf.setPointSize(10)
self.CB1=QLineEdit(self)
self.CB1.setText("255,255,255")
self.CB1.move(0.62*Width,0.03*Height)
self.CB1.resize(0.35*Width,0.065*Height)
self.CB1.setFont(qf)
self.CB1.setStyleSheet(self.SS_Inf_Box)
#
self.CB2=QLineEdit(self)
self.CB2.setText("#FFFFFF")
self.CB2.move(0.62*Width,0.13*Height)
self.CB2.resize(0.35*Width,0.065*Height)
self.CB2.setFont(qf)
self.CB2.setStyleSheet(self.SS_Inf_Box)
#
self.CB3=QLineEdit(self)
self.CB3.setText("0,0,255")
self.CB3.move(0.62*Width,0.23*Height)
self.CB3.resize(0.35*Width,0.065*Height)
self.CB3.setFont(qf)
self.CB3.setStyleSheet(self.SS_Inf_Box)
#
self.CB1.setFocusPolicy(Qt.NoFocus)
self.CB2.setFocusPolicy(Qt.NoFocus)
self.CB3.setFocusPolicy(Qt.NoFocus)
# 绘制颜色信息标签
self.CL1=QPushButton(self)
self.CL1.setGeometry(0.448*Width,0.025*Height,0.14*Width,0.075*Height)
self.CL1.setStyleSheet(self.SS_Inf_Label)
self.CL1.setText("RGB")
self.CL1.setFont(qf)
self.CL1.setProperty(Children,self.CB1)
self.CL1.clicked.connect(self.copyInf)
#
self.CL2=QPushButton(self)
self.CL2.setGeometry(0.448*Width,0.125*Height,0.14*Width,0.075*Height)
self.CL2.setStyleSheet(self.SS_Inf_Label)
self.CL2.setText("HEX")
self.CL2.setFont(qf)
self.CL2.setProperty(Children,self.CB2)
self.CL2.clicked.connect(self.copyInf)
#
self.CL3=QPushButton(self)
self.CL3.setGeometry(0.448*Width,0.225*Height,0.14*Width,0.075*Height)
self.CL3.setStyleSheet(self.SS_Inf_Label)
self.CL3.setText("HSV")
self.CL3.setFont(qf)
self.CL3.setProperty(Children,self.CB3)
self.CL3.clicked.connect(self.copyInf)
def setMainBox(self):# 设置其他label
Width=self.Width
Height=self.Height
# 左上角当前颜色显示框
self.mainBox=QPushButton(self)
self.mainBox.setGeometry(0.04*Width,0.025*Height,0.368*Width,0.28*Height)
self.mainBox.setStyleSheet(self.SS_Main_Box)
self.mainBox.clicked.connect(self.selectedMain)
def setBtn(self):# 设置按钮
Width=self.Width
Height=self.Height
# 按钮字体
qf=QFont()
qf.setBold(True)
qf.setPointSize(10)
qf.setFamily("Cambria")
# 获取颜色按钮
self.bnt1=QPushButton(self)
self.bnt1.setGeometry(0.024*Width,0.33*Height,0.4*Width,0.06*Height)
self.bnt1.setStyleSheet(self.SS_btn_1)
self.bnt1.setText("Get Screen Color")
self.bnt1.setFont(qf)
self.bnt1.clicked.connect(self.getColor)
# 保存颜色按钮
self.bnt2=QPushButton(self)
self.bnt2.setGeometry(0.444*Width,0.33*Height,0.26*Width,0.06*Height)
self.bnt2.setStyleSheet(self.SS_btn_1)
self.bnt2.setText("Save Color")
self.bnt2.setFont(qf)
self.bnt2.clicked.connect(self.saveColor)
# 删除颜色按钮
self.bnt3=QPushButton(self)
self.bnt3.setGeometry(0.724*Width,0.33*Height,0.26*Width,0.06*Height)
self.bnt3.setStyleSheet(self.SS_btn_3)
self.bnt3.setText("Delete Last")
self.bnt3.setFont(qf)
self.bnt3.clicked.connect(self.deleteColor)
def setColorBox(self):# 绘制存储颜色及预设颜色框
Width=self.Width
Height=self.Height
# 存储颜色框
for i in range(0,2):
for j in range(0,10):
storeColorBox=QPushButton(self)
storeColorBox.setGeometry((0.04+0.093*j)*Width,(0.475+0.07*i)*Height,0.08*Width,0.06*Height)
storeColorBox.setStyleSheet(self.SS_Color_Box)
storeColorBox.setProperty("storeId",i*10+j)
storeColorBox.setProperty("Color",#FFFFFF)
storeColorBox.clicked.connect(self.selectedStore)
self.storeList.append(storeColorBox)
# 预设颜色框
for i in range(0,4):
for j in range(0,10):
if i*10+j<36:
defaultColorBox=QPushButton(self)
defaultColorBox.setGeometry((0.04+0.093*j)*Width,(0.7+0.07*i)*Height,0.08*Width,0.06*Height)
defaultColorBox.setStyleSheet("QPushButton{background: "
+self.defaultColor[i*10+j]+";border: 2px solid rgb(150,150,150);border-radius:3px}")
defaultColorBox.setProperty("defaultId",i*10+j)
defaultColorBox.clicked.connect(self.selectedDefault)
self.defaultList.append(storeColorBox)
# ===========================================================================================
# 函数调用:
myapp = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(myapp.exec_())
以上就是基于Python制作一款屏幕颜色提取器的详细内容,更多关于Python屏幕颜色提取器的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。