Я пытаюсь перебрать пиксели изображения, точнее снимок экрана, который я получаю через модуль ImageGrab.Вот мой код:
from PIL import ImageGrab as ig
import numpy as np
from pynput.mouse import Controller
from pynput.keyboard import Key
from pynput import keyboard
mouse= Controller()
def onpress(key):
try:
pressed_key= key.char
except AttributeError:
pressed_key= str(key)[4:]
if pressed_key == 'esc':
print('Quitting process')
return False
elif pressed_key == 'space':
mousepos= mouse.position
pic= ig.grab()
arr= np.array(pic)
print(f'Pixel color at {mousepos}: RGB{arr[mousepos]}')
# here the error is raised
with keyboard.Listener(on_press= onpress) as listener:
listener.join()
Я хочу проверить цвет RGB пикселя в позиции мыши при нажатии пробела.Он отлично работает для «левого верхнего» пикселя, вот несколько примеров вывода:
1) Pixel color at (150, 193): RGB[242 243 244]
2) Pixel color at (579, 302): RGB[0 0 0]
3) Pixel color at (887, 108): RGB[145 89 4]
, но когда я немного двигаю мышь в правом нижнем углу экрана (из центра просточуть-чуть внизу справа) возникает такая ошибка:
Traceback (most recent call last):
File "imagegrab.py", line 64, in <module>
listener.join()
File "C:\Users\marca\Anaconda3\lib\site-packages\pynput\_util\__init__.py", line 199, in join
six.reraise(exc_type, exc_value, exc_traceback)
File "C:\Users\marca\Anaconda3\lib\site-packages\six.py", line 692, in reraise
raise value.with_traceback(tb)
File "C:\Users\marca\Anaconda3\lib\site-packages\pynput\_util\__init__.py", line 154, in inner
return f(self, *args, **kwargs)
File "C:\Users\marca\Anaconda3\lib\site-packages\pynput\keyboard\_win32.py", line 237, in _process
self.on_press(key)
File "C:\Users\marca\Anaconda3\lib\site-packages\pynput\_util\__init__.py", line 75, in inner
if f(*args) is False:
File "imagegrab.py", line 42, in onpress
print(f'{count}) Pixel color at {mousepos}: RGB{arr[mousepos]}')
IndexError: index 1152 is out of bounds for axis 0 with size 1080
Эта ошибка НЕ возникает, если я загружаю изображение, используя
pixels= pic.load()
print(f'{count}) Pixel color at {mousepos}: RGB{pixels[mousepos]}')
, что прекрасно работает (здесьЯ указывал на верхний левый и нижний правый углы экрана):
1) Pixel color at (0, 0): RGB(56, 36, 12)
2) Pixel color at (1914, 1016): RGB(22, 15, 5)
Я думаю, что это как-то связано с DPI экрана моего ноутбука, так как ранее мне приходилось применять исправление, которое былопредложил в этом потоке Github , поскольку у меня была такая проблема с захватом экрана.
Индекс массива, показанный в ошибке (1152), как вы можетеВидите, переполняет обычное разрешение HD-экранов 1920x1080.Я понятия не имею, что нужно сделать, чтобы это исправить, поэтому я надеюсь, что мне все ясно, и кто-то может мне помочь.