python 获取屏幕颜色,python抓取屏幕一个点的颜色

  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 pag

  from 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,QLineEdit

  from 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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: