Форум сайта python.su
Нужно как можно быстрее получать информацию о цвете пикселя с экрана.
Благодаря каким библиотекам это можно реализовать? Желательно с примером кода. Спасибо.
Пока что пробую pyautogui.pixel() но он слишком медленный вот сам код
import time import pyautogui from pynput import keyboard pressD = False pressF = False pressJ = False pressK = False RUN = True while RUN: #D colorD = pyautogui.pixel(210,610) #Получение цвета пикселя print("colorD = ",colorD[0]) #Значение RED канала пикселя if colorD[0] > 230: #спам клавиши "d" keyboard.Controller().press('d') pressD = True print("'D' Down") else: if pressD: #прекращение спама keyboard.Controller().release('d') pressD = False print("'D' UP") #F colorF = pyautogui.pixel(310,610) #Получение цвета пикселя print("color = ",colorF[2]) #Значение BLUE канала пикселя if colorF[2] > 230: #спам клавиши "f" keyboard.Controller().press('f') pressF = True print("'F' Down") else: if pressF: #прекращение спама keyboard.Controller().release('f') pressF = False print("'F' UP") #J colorJ = pyautogui.pixel(410,610) #Получение цвета пикселя print("color = ",colorJ[2]) #Значение BLUE канала пикселя if colorJ[2] > 230: #спам клавиши "j" keyboard.Controller().press('j') pressJ = True print("'J' Down") else: if pressJ: #прекращение спама keyboard.Controller().release('j') pressJ = False print("'J' UP") #K colorK = pyautogui.pixel(510,610) #Получение цвета пикселя print("color = ",colorK[0]) #Значение RED канала пикселя if colorK[0] > 230: #спам клавиши "k" keyboard.Controller().press('k') pressK = True print("'K' Down") else: if pressK: #прекращение спама keyboard.Controller().release('k') pressK = False print("'K' UP")
Отредактировано lllNF (Авг. 10, 2018 12:06:56)
Офлайн
lllNFС чего вы решили что он медленный? Где код по которому вы сделали вывод что он медленный?
но он слишком медленный
Офлайн
lllNF код в студию потому как даже в pyautogui есть несколько способов получить цвет пиксела.
[code python][/code]
Офлайн
Где код по которому вы сделали вывод что он медленный?
import time import pyautogui from pynput import keyboard pressD = False pressF = False pressJ = False pressK = False RUN = True while RUN: #D colorD = pyautogui.pixel(210,610) #Получение цвета пикселя print("colorD = ",colorD[0]) #Значение RED канала пикселя if colorD[0] > 230: #спам клавиши "d" keyboard.Controller().press('d') pressD = True print("'D' Down") else: if pressD: #прекращение спама keyboard.Controller().release('d') pressD = False print("'D' UP") #F colorF = pyautogui.pixel(310,610) #Получение цвета пикселя print("color = ",colorF[2]) #Значение BLUE канала пикселя if colorF[2] > 230: #спам клавиши "f" keyboard.Controller().press('f') pressF = True print("'F' Down") else: if pressF: #прекращение спама keyboard.Controller().release('f') pressF = False print("'F' UP") #J colorJ = pyautogui.pixel(410,610) #Получение цвета пикселя print("color = ",colorJ[2]) #Значение BLUE канала пикселя if colorJ[2] > 230: #спам клавиши "j" keyboard.Controller().press('j') pressJ = True print("'J' Down") else: if pressJ: #прекращение спама keyboard.Controller().release('j') pressJ = False print("'J' UP") #K colorK = pyautogui.pixel(510,610) #Получение цвета пикселя print("color = ",colorK[0]) #Значение RED канала пикселя if colorK[0] > 230: #спам клавиши "k" keyboard.Controller().press('k') pressK = True print("'K' Down") else: if pressK: #прекращение спама keyboard.Controller().release('k') pressK = False print("'K' UP")
Отредактировано lllNF (Авг. 10, 2018 12:09:48)
Офлайн
lllNF а у вас часом не венда? если венда то таки да он может работать медленно. Начнем с того что что у самого pyautogui нет метода pixel(), оно берет его из pyscreeze
.... try: import pyscreeze from pyscreeze import (center, grab, locate, locateAll, locateAllOnScreen, locateCenterOnScreen, locateOnScreen, pixel, pixelMatchesColor, screenshot) ...
.... def pixel(x, y): if sys.platform == 'win32': # On Windows, calling GetDC() and GetPixel() is twice as fast as using our screenshot() function. hdc = windll.user32.GetDC(0) color = windll.gdi32.GetPixel(hdc, x, y) # color is in the format 0xbbggrr https://msdn.microsoft.com/en-us/library/windows/desktop/dd183449(v=vs.85).aspx r = color % 256 g = (color // 256) % 256 b = color // (256 ** 2) return (r, g, b) else: return screenshot().getpixel((x, y)) ...
[code python][/code]
Отредактировано PEHDOM (Авг. 10, 2018 14:26:09)
Офлайн
PEHDOM
lllNF а у вас часом не венда? если венда то таки да он может работать медленно.
Офлайн
lllNFдавайте для начала все же определимся с вашей скоростью, с чего вы взяли что оно работает медленно? Имхо 0,003 секунды вполне достаточно для любого бота, или тогда хотябы выложите сколько у вас занимает времени эта процедура.
Но есть ли способ более быстрого получения цвета пикселя для python 3.x?
[code python][/code]
Отредактировано PEHDOM (Авг. 10, 2018 16:01:06)
Офлайн
lllNFЭто неправильный вопрос, все зависит от задачи, если вам нужно таки один пиксел то всежи имхо быстрее чем GetPixel сделать это весьма трудно. Другое дело если нужно найти какойто пиксел на экране или перебрать несколько пикселов, тогда имеет смысл сделать скриншот и уже работать с ним. Например на выполнение PIL.ImageGrab.grab() уходит теже 0.02 секунды, но потом вы уже не теряете время, а просто перебиаете пикселы что вам нужно.
. Но есть ли способ более быстрого получения цвета пикселя для python 3.x?
[code python][/code]
Отредактировано PEHDOM (Авг. 10, 2018 17:09:27)
Офлайн
PEHDOMДа, для простого получения пикселя это занимает 0.003 сек. но в самом коде помимо этого есть много других команд, они тоже занимают время. Сверху оригинальных код, на одно выполнение которого уходит ~0.06 сек, а это много.
Офлайн
lllNFпопробуй QImage, там функции сишные
Как можно оптимизировать этот код?
>>>from PyQt5 import Qt >>> img = Qt.QImage(100,100,Qt.QImage.Format_RGB32) >>> img.fill(Qt.QColor(100,150,200)) >>> pix = img.pixel(10,10) >>> r,g,b = Qt.qRed(pix),Qt.qGreen(pix),Qt.qBlue(pix) >>> r,g,b (100, 150, 200) >>>
Отредактировано vic57 (Авг. 10, 2018 21:25:57)
Офлайн