python 实时取色器3.0(升级版)【内附源码】

之前写给女朋友的实时取色器功能太单一了,后来我更新成2.0版本,增添了一键复制的功能。最近女友需要同时拥有测距、RGB取色、十六进制取色的功能,更新后我命名为3.0版本,现分享一下 

需要用到的库: pyautogui、sys、ctypes、pyperclip、_thread、time

完整源码:

# -*- coding: utf-8 -*-
import pyautogui, sys
from ctypes import *  # 获取屏幕上某个坐标的颜色
import pyperclip
import _thread
import time
ccc = ''

def GET16(tmp):
    rgb = tmp.split(',')  # 将RGB格式划分开来
    strs = '#'
    for i in rgb:
        num = int(i)  # 将str转int
        # 将R、G、B分别转化为16进制拼接转换并大写
        strs += str(hex(num))[-2:].replace('x', '0').upper()

    return strs

def qiehuan(event):
    global huan,ccc
    if huan == 'rgb':
        ccc = '      十六进制模式'
        huan = 'get16'
    elif huan == 'get16':
        ccc = '        测距模式'
        huan = 'juli'
    elif huan == 'juli':
        ccc = '        RGB制模式'
        huan = 'rgb'

def GetColor():
    r = 0
    g = 0
    b = 0
    try:
        x, y = pyautogui.position()
        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
    except KeyboardInterrupt:
        print('\n')

    return r, g, b

def func(event):
    global ccc
    print(bb)
    pyperclip.copy(bb)
    _thread.start_new_thread(tip, ())
def tip():
    global ccc
    ccc = '复制成功,已复制到粘贴板'
    time.sleep(1)
    ccc = ''

def juli(event):
    global x1,x2,y1,y2,juli,ccc
    if juli =='ling':
        x1, y1 = pyautogui.position()
        juli = 'yi'
    elif juli =='yi':
        juli = 'ling'
    elif juli =='er':
        ccc = ''
        juli ='ling'


import tkinter as tk

window = tk.Tk()
window.wm_attributes('-topmost', 1)
window.title('小白取色器2.0')
window.geometry('310x100')
window.bind("<Control-q>",func)
window.bind("<Control-w>",qiehuan)
window.bind("<Control-e>",juli)
huan = 'rgb'
juli = 'ling'
a = tk.StringVar()
cc = tk.StringVar()
l = tk.Label(window, textvariable=a,  # 标签的文字
             bg='green',  # 标签背景颜色
             font=('Arial', 12),  # 字体和字体大小
             width=15, height=2  # 标签长宽(以字符长度计算)
             )
l.pack()  # 固定窗口位置
Label1 = tk.Label(window, text='Ctrl+q复制/+w切换/+e拾取', font=('黑体', 12), fg = 'purple', anchor='center').place(y=50,x=30)
Label2 = tk.Label(window, textvariable=cc, font=('黑体', 12), fg='red', anchor='center').place(y=75, x=30)

l.focus_set()
try:
    while 1:
        global bb
        r, g, b = GetColor()

        a.set(str(r) + ',' + str(g) + ',' + str(b))
        bb = '{'+str(r)+','+str(g)+','+str(b)+'}'

        if huan == 'rgb':

            a.set(str(r) + ',' + str(g) + ',' + str(b))
            bb = '{' + str(r) + ',' + str(g) + ',' + str(b) + '}'

        elif huan =='get16':
            a.set(GET16(str(r) + ',' + str(g) + ',' + str(b)))
            bb = GET16(str(r) + ',' + str(g) + ',' + str(b))
        elif huan =='juli':
            if juli =='ling':
                ccc = '      请选择第一点'
                xx, yy = pyautogui.position()
                a.set('x=' + str(xx) + ',y=' + str(yy))
            if juli =='yi':
                ccc = '  已选择第一点,请移动鼠标'
                xx, yy = pyautogui.position()
                show_x = xx-x1
                print('1')
                show_y = yy-y1
                a.set(f'▲x={show_x},▲y={show_y}')
                print('1')
        cc.set(ccc)
        l.update()
except:
    print('已退出')
window.mainloop()

窗体的实现: 

import tkinter as tk

window = tk.Tk()
window.wm_attributes('-topmost', 1)
window.title('小白取色器2.0')
window.geometry('310x100')
window.bind("<Control-q>",func)
window.bind("<Control-w>",qiehuan)
window.bind("<Control-e>",juli)
huan = 'rgb'
juli = 'ling'
a = tk.StringVar()
cc = tk.StringVar()
l = tk.Label(window, textvariable=a,  # 标签的文字
             bg='green',  # 标签背景颜色
             font=('Arial', 12),  # 字体和字体大小
             width=15, height=2  # 标签长宽(以字符长度计算)
             )
l.pack()  # 固定窗口位置
Label1 = tk.Label(window, text='Ctrl+q复制/+w切换/+e拾取', font=('黑体', 12), fg = 'purple', anchor='center').place(y=50,x=30)
Label2 = tk.Label(window, textvariable=cc, font=('黑体', 12), fg='red', anchor='center').place(y=75, x=30)

l.focus_set()
try:
    while 1:
        global bb
        r, g, b = GetColor()

        a.set(str(r) + ',' + str(g) + ',' + str(b))
        bb = '{'+str(r)+','+str(g)+','+str(b)+'}'

        if huan == 'rgb':

            a.set(str(r) + ',' + str(g) + ',' + str(b))
            bb = '{' + str(r) + ',' + str(g) + ',' + str(b) + '}'

        elif huan =='get16':
            a.set(GET16(str(r) + ',' + str(g) + ',' + str(b)))
            bb = GET16(str(r) + ',' + str(g) + ',' + str(b))
        elif huan =='juli':
            if juli =='ling':
                ccc = '      请选择第一点'
                xx, yy = pyautogui.position()
                a.set('x=' + str(xx) + ',y=' + str(yy))
            if juli =='yi':
                ccc = '  已选择第一点,请移动鼠标'
                xx, yy = pyautogui.position()
                show_x = xx-x1
                print('1')
                show_y = yy-y1
                a.set(f'▲x={show_x},▲y={show_y}')
                print('1')
        cc.set(ccc)
        l.update()
except:
    print('已退出')
window.mainloop()

 

效果展示:

时间紧张,今日暂不细讲

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 实时屏幕取色可以通过使用 MediaProjection API 获取屏幕截图,然后解析像素颜色来实现。 以下是一个简单的示例代码: 1. 首先,需要在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 然后,在需要获取屏幕颜色的 Activity 中,请求获取屏幕截图的权限: ```java private static final int REQUEST_MEDIA_PROJECTION = 1; private MediaProjectionManager mMediaProjectionManager; private MediaProjection mMediaProjection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE); Intent intent = mMediaProjectionManager.createScreenCaptureIntent(); startActivityForResult(intent, REQUEST_MEDIA_PROJECTION); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_MEDIA_PROJECTION) { if (resultCode == RESULT_OK) { mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data); startCapture(); } } } ``` 3. 接下来,在 startCapture() 方法中,创建一个 VirtualDisplay 对象来捕获屏幕图像,并将其转换为 Bitmap 对象: ```java private void startCapture() { DisplayMetrics metrics = getResources().getDisplayMetrics(); int screenWidth = metrics.widthPixels; int screenHeight = metrics.heightPixels; int screenDensity = metrics.densityDpi; ImageReader imageReader = ImageReader.newInstance(screenWidth, screenHeight, PixelFormat.RGBA_8888, 2); mMediaProjection.createVirtualDisplay("ScreenCapture", screenWidth, screenHeight, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.getSurface(), null, null); Image image = imageReader.acquireLatestImage(); if (image != null) { Bitmap bitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888); Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); int pixelStride = planes[0].getPixelStride(); int rowStride = planes[0].getRowStride(); int rowPadding = rowStride - pixelStride * image.getWidth(); bitmap.copyPixelsFromBuffer(buffer); image.close(); } } ``` 4. 最后,通过解析 Bitmap 对象的像素值来获取屏幕上指定位置的颜色值: ```java private int getPixelColor(int x, int y) { Bitmap bitmap = getScreenShot(); int pixel = bitmap.getPixel(x, y); bitmap.recycle(); return pixel; } ``` 注意:由于获取屏幕截图的过程比较耗时,建议在子线程中执行上述操作,以免阻塞主线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值