使用Python實(shí)現(xiàn)獲取屏幕像素顏色值
一、一個(gè)小工具,按住F10鍵,顏色值會(huì)跟著顯示。
完整代碼
import tkinter as tk import pyautogui import keyboard class ColorViewer: def __init__(self): self.root = tk.Tk() self.root.overrideredirect(True) # 無(wú)邊框 self.root.wm_attributes("-topmost", 1) # 最前 self.root.configure(bg="black") self.root.geometry("140x60") self.color_frame = tk.Frame(self.root, width=24, height=48, bg="white") self.color_frame.place(x=5, y=5) self.hex_label = tk.Label(self.root, text="#------", font=("Consolas", 13), bg="black", fg="white") self.hex_label.place(x=35, y=5) self.coord_label = tk.Label(self.root, text="(0000,0000)", font=("Consolas", 11), bg="black", fg="white") self.coord_label.place(x=35, y=30) self.update_loop() self.root.withdraw() # 初始隱藏 self.root.mainloop() def update_loop(self): if keyboard.is_pressed("F10"): x, y = pyautogui.position() r, g, b = pyautogui.screenshot(region=(x, y, 1, 1)).getpixel((0, 0)) hex_color = "#{:02x}{:02x}{:02x}".format(r, g, b) self.color_frame.configure(bg=hex_color) self.hex_label.configure(text=hex_color) self.coord_label.configure(text=f"({x},{y})") # 自動(dòng)移動(dòng)窗口,避免遮擋鼠標(biāo) screen_w = self.root.winfo_screenwidth() screen_h = self.root.winfo_screenheight() win_w, win_h = 140, 60 offset = 20 pos_x = x + offset pos_y = y + offset if pos_x + win_w > screen_w: pos_x = x - win_w - offset if pos_y + win_h > screen_h: pos_y = y - win_h - offset self.root.geometry(f"{win_w}x{win_h}+{pos_x}+{pos_y}") self.root.deiconify() else: self.root.withdraw() self.root.after(30, self.update_loop) # 循環(huán)檢查 if __name__ == "__main__": ColorViewer()
二、樣式示例
三、方法補(bǔ)充
python獲取像素顏色
使用image模塊中的getpixel函數(shù)獲得像素值。
GetPixel函數(shù)檢索指定坐標(biāo)點(diǎn)的像素的RGB顏色值。
函數(shù)原型:COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)
參數(shù):
hdc:設(shè)備環(huán)境句柄。
nXPos:指定要檢查的像素點(diǎn)的邏輯X軸坐標(biāo)。
nYPos:指定要檢查的像素點(diǎn)的邏輯Y軸坐標(biāo)。
示例:
import Image import sys im = Image.open(sys.argv[1]) width = im.size[0] height = im.size[1] print "/* width:%d */"%(width) print "/* height:%d */"%(height) count = 0 for h in range(0, height): for w in range(0, width): pixel = im.getpixel((w, h)) for i in range(0,3): count = (count+1)%16 if (count == 0): print "0x%02x,/n"%(pixel[i]), else: print "0x%02x,"%(pixel[i]),
Python獲取屏幕指定坐標(biāo)處像素顏色
import ctypes from ctypes import wintypes from typing import Sequence, Generator user32 = ctypes.windll.user32 gdi32 = ctypes.windll.gdi32 # 定義類型 HWND = wintypes.HWND HDC = wintypes.HDC HBITMAP = wintypes.HBITMAP class BITMAPINFOHEADER(ctypes.Structure): _fields_ = [ ("biSize", wintypes.DWORD), ("biWidth", wintypes.LONG), ("biHeight", wintypes.LONG), ("biPlanes", wintypes.WORD), ("biBitCount", wintypes.WORD), ("biCompression", wintypes.DWORD), ("biSizeImage", wintypes.DWORD), ("biXPelsPerMeter", wintypes.LONG), ("biYPelsPerMeter", wintypes.LONG), ("biClrUsed", wintypes.DWORD), ("biClrImportant", wintypes.DWORD) ] class BITMAPINFO(ctypes.Structure): _fields_ = [ ("bmiHeader", BITMAPINFOHEADER), ("bmiColors", wintypes.DWORD * 3) ] def get_pixel_color(coords: Sequence[tuple[int, int]], hwnd: HWND) -> Generator[tuple[int, int, int], None, None]: rect = wintypes.RECT() user32.GetClientRect(hwnd, ctypes.byref(rect)) width = rect.right - rect.left height = rect.bottom - rect.top # 創(chuàng)建內(nèi)存設(shè)備上下文 hdc_src = user32.GetDC(hwnd) hdc_dst = gdi32.CreateCompatibleDC(hdc_src) bmp = gdi32.CreateCompatibleBitmap(hdc_src, width, height) gdi32.SelectObject(hdc_dst, bmp) # 使用 BitBlt 復(fù)制窗口內(nèi)容到內(nèi)存設(shè)備上下文 gdi32.BitBlt(hdc_dst, 0, 0, width, height, hdc_src, 0, 0, 0x00CC0020) # SRCCOPY # 獲取位圖信息 bmi = BITMAPINFO() bmi.bmiHeader.biSize = ctypes.sizeof(BITMAPINFOHEADER) bmi.bmiHeader.biWidth = width bmi.bmiHeader.biHeight = -height # 負(fù)值表示自底向上 bmi.bmiHeader.biPlanes = 1 bmi.bmiHeader.biBitCount = 32 bmi.bmiHeader.biCompression = 0 # 創(chuàng)建緩沖區(qū)并獲取位圖數(shù)據(jù) buffer = ctypes.create_string_buffer(width * height * 4) gdi32.GetDIBits(hdc_dst, bmp, 0, height, buffer, ctypes.byref(bmi), 0) # 釋放資源 gdi32.DeleteObject(bmp) gdi32.DeleteDC(hdc_dst) user32.ReleaseDC(hwnd, hdc_src) # 遍歷指定坐標(biāo)并返回像素顏色 for x, y in coords: if 0 <= x < width and 0 <= y < height: offset = (y * width + x) * 4 color = buffer[offset:offset + 4] yield color[2], color[1], color[0] # BGR -> RGB else: yield (0, 0, 0)
到此這篇關(guān)于使用Python實(shí)現(xiàn)獲取屏幕像素顏色值的文章就介紹到這了,更多相關(guān)Python獲取屏幕像素顏色值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過實(shí)例了解python__slots__使用方法
這篇文章主要介紹了通過實(shí)例了解python__slots__使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09keras實(shí)現(xiàn)圖像預(yù)處理并生成一個(gè)generator的案例
這篇文章主要介紹了keras實(shí)現(xiàn)圖像預(yù)處理并生成一個(gè)generator的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-06-06詳解Python中數(shù)據(jù)類型的轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Python中數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03python遠(yuǎn)程調(diào)用rpc模塊xmlrpclib的方法
今天小編就為大家分享一篇python遠(yuǎn)程調(diào)用rpc模塊xmlrpclib的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-01-01基于Python實(shí)現(xiàn)自動(dòng)關(guān)機(jī)小工具
上班族經(jīng)常會(huì)遇到這樣情況,著急下班結(jié)果將關(guān)機(jī)誤點(diǎn)成重啟,或者臨近下班又通知開會(huì),開完會(huì)已經(jīng)遲了還要去給電腦關(guān)機(jī)。今天使用PyQt5做了個(gè)自動(dòng)關(guān)機(jī)的小工具,設(shè)置好關(guān)機(jī)時(shí)間然后直接提交即可,需要的可以參考一下2022-10-10Python對(duì)list列表進(jìn)行去重的幾種方法
python?列表就是我們js中的數(shù)組了,我們下文整理幾個(gè)常用的python?列表去重實(shí)現(xiàn)方法,非常的簡(jiǎn)單好用,通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10用python wxpy管理微信公眾號(hào)并利用微信獲取自己的開源數(shù)據(jù)
這篇文章主要介紹了用python wxpy管理微信公眾號(hào)并利用微信獲取自己的開源數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07