Je souhaite utiliser pyautogui même dans un environnement multi-écrans, ou plus précisément, je souhaite reconnaître les images dans un sous-écran dans un environnement multi-écrans.
python 3.8.5 pyautogui 0.9.50 pyscreez 0.1.26 Windows OS uniquement
Référence: Pourquoi la fonction LocateOnScreen () de pyautogui ne prend pas en charge le multi-affichage Dans l'article ci-dessus, j'ai trouvé la description suivante.
ImageGrab.grab () de PIL ne prend pas en charge le double affichage
Lis ça? J'ai pensé, j'ai vérifié la définition de imageGrab.grab ().
def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None):
all_screens=False
Vérifiez l'argument comme ça, je ne sais pas depuis un certain temps, mais au moins en python 3.8.5, la fonction grab semble avoir changé.
Lorsque le système d'exploitation est Windows, la fonction suivante appelle image.grab () dans LocateOnScreen () de pyautogui.
def _screenshot_win32(imageFilename=None, region=None):
"""
TODO
"""
# TODO - Use the winapi to get a screenshot, and compare performance with ImageGrab.grab()
# https://stackoverflow.com/a/3586280/1893164
im = ImageGrab.grab()
if region is not None:
assert len(region) == 4, 'region argument must be a tuple of four ints'
region = [int(x) for x in region]
im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
if imageFilename is not None:
im.save(imageFilename)
return im
Donc, je vais passer un argument à imageGrab.grab (), c'est tout.
def _screenshot_win32(imageFilename=None, region=None):
"""
TODO
"""
# TODO - Use the winapi to get a screenshot, and compare performance with ImageGrab.grab()
# https://stackoverflow.com/a/3586280/1893164
#im = ImageGrab.grab()
im = ImageGrab.grab(all_screens=True)
if region is not None:
assert len(region) == 4, 'region argument must be a tuple of four ints'
region = [int(x) for x in region]
im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
if imageFilename is not None:
im.save(imageFilename)
return im
La reconnaissance d'image est désormais possible même sur les sous-écrans.
L'affichage est aligné
[1][2][3]
Ou
[1][2]
[3][4]
Ce serait bien s'ils étaient alignés d'une manière bien comportée comme
[2] [1] [3](Aménagement de ma maison)
Lorsqu'il est agencé comme ceci, LocateOnScreen renvoie les coordonnées avec LeftTop de [2] comme (0,0), tandis que le côté fenêtre requiert les coordonnées avec LeftTop de [1] comme (0,0). Sera.
Ce problème a une API qui énumère les moniteurs et renvoie les coordonnées dans win32api, je voudrais donc l'utiliser la prochaine fois pour le résoudre. Jusqu'à ici pour cette fois.
Recommended Posts