[英]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.