簡體   English   中英

如何盡快獲取python中某個像素點的顏色?

[英]How to get the color of a pixel in python as fast as possible?

我在 ubuntu 上,我想每 0.1 秒檢查一次屏幕上特定像素的顏色。 我怎樣才能做到這一點?

我知道 PIL,但這只需要每 0.1 秒就一個像素進行完整的屏幕截圖。

然后我發現這個方法使用 ctypes.windll: Faster method of reading screen pixel in Python than PIL?

但這行不通,因為我不在 Windows 上。還有其他想法嗎?

編輯:感謝 b_c 解決了

from Xlib import display, X
from PIL import Image #PIL


def getColor(x,y):
    W, H = 1, 1
    dsp = display.Display()
    root = dsp.screen().root
    raw = root.get_image(x, y, W, H, X.ZPixmap, 0xffffffff)
    image = Image.frombytes("RGB", (W, H), raw.data, "raw", "BGRX")
    print image.getpixel((0, 0))
    time.sleep(0.01)

PIL 和其他類似程序通常允許您指定一個邊界框來抓取較小的數量

PyAutoGui 允許您采取更小的部分

如此處所引用的https://pyautogui.readthedocs.io/en/latest/screenshot.html代碼如

pyautogui.screenshot(region=(0,0, 300, 400))

可能有用

https://pillow.readthedocs.io/en/4.2.x/reference/Image.html

也可能很有用, bbox允許您只觀察一個小區域。

raw.data 有時會作為字符串返回,例如當顏色為黑色時。 這會導致:

TypeError:需要類似字節的 object,而不是“str”

您發布的代碼的一個骯臟的解決方法是:

from Xlib import display, X
from PIL import Image #PIL

def getColor(x,y):
    W, H = 1, 1
    dsp = display.Display()
    root = dsp.screen().root
    raw = root.get_image(x, y, W, H, X.ZPixmap, 0xffffffff)
    if isinstance(raw.data,str):
        bytes=raw.data.encode()
    else:
        bytes=raw.data
    image = Image.frombytes("RGB", (W, H), bytes, "raw", "BGRX")
    print image.getpixel((0, 0))
    time.sleep(0.01)

您好,我知道如何解決您的問題。 我創建了一個腳本,它循環檢查一個或多個像素是否改變顏色。

此腳本僅使用 PIL 來執行此操作。

進行驗證所需的時間為 33 毫秒。

因為那33或32ms是截屏的時間,所以無論你需要檢查多少像素,時間總是33ms。 不幸的是,我還沒有找到任何其他更快的 package。

import time
import keyboard
from PIL import Image, ImageGrab


while not keyboard.is_pressed('ctrl'): # press ctrl to stop.
    start_time = time.time()

    px = ImageGrab.grab().load()
    color1 = px[439, 664] # pixel 1
    color2 = px[575, 664] # pixel 2
    color3 = px[706, 664] # pixel 3
    color4 = px[842, 664] # pixel 4
    
    print(color1)

    print(f"Finish in: {round(1000 * (time.time() - start_time))} ms ") # how much  he takes to finish

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM