Bonjour, je voulais savoir si c'était possible de par exemple verifier si la couleur en 200,200 est du bleu sans avoir a prendre une capture d'écran, la stocker et l'ouvrir dans le programme
Version imprimable
Bonjour, je voulais savoir si c'était possible de par exemple verifier si la couleur en 200,200 est du bleu sans avoir a prendre une capture d'écran, la stocker et l'ouvrir dans le programme
Bonjour
A mon avis non. Parce que ce que tu vois en 200,200 ce n'est pas ton écran mais une image mise en "fond d'écran" !!!
En tout cas, Qt permet d'appeler QApplication.desktop() qui retourne un QDesktopWidget mais nulle part dans le QDesktopWidget je n'ai trouvé de champ décrivant les pixels. On a la taille de l'écran oui, mais pas son contenu.
Et de toute façon tu devras passer par une librairie d'IHM (comme Qt que j'ai mentionné).
Avant de poser une question vous êtes supposé chercher un peu sur le ouèbe... dans ce cas particulier, on trouve par exemple ceci qui montre qu'il y a des pistes à explorer (et que c'est possible).
- W
Ok, je me suis trompé, c'est possible. Désolé.
Il paraîtrait suivant le topic mentionné par Wiztiti que ctypes.windll.gdi32.GetPixel() est la méthode la plus rapide ! Edit : sous windows 7 malheureusement...
A vérifier en 3.X...
Code:
1
2
3
4
5
6 def rgba(colorref): mask = 0xff return [(colorref & (mask << (i * 8))) >> (i * 8) for i in range(4)] #cf. https://stackoverflow.com/questions/58639656/how-to-convert-colorref-from-getpixel-to-rgb-in-python >>> rgba(ctypes.windll.gdi32.GetPixel(dc,200,200)) [253, 253, 253, 0]
Ah bon ? :oops:
Au final il semble impossible de désactiver la composition du bureau sur Windows 10 donc ctypes.windll.gdi32.GetPixel() reste lent...
Hello,
il y a aussi la bibliothèque mss qui est multiplateforme (nécessite python 3.5+) :
Voici un test de performance ente ImageGrab et mss :Citation:
An ultra fast cross-platform multiple screenshots module in pure python using ctypes.
Résultat sous Windows 11 :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 from PIL import ImageGrab import mss.tools import timeit with mss.mss() as sct: # The screen part to capture monitor = {"top": 200, "left": 200, "width": 1, "height": 1} startTime = timeit.default_timer() sct_img = sct.grab(monitor) endTime = timeit.default_timer() r, g, b = sct_img.pixel(0, 0) runTime = endTime - startTime print("runtime mss: " + str(runTime) + "s") print(r, g, b) startTime = timeit.default_timer() img = ImageGrab.grab(bbox=(200,200,201,201)) endTime = timeit.default_timer() r, g, b = img.getpixel((0, 0)) runTime = endTime - startTime print("runtime PIL.ImageGrab : " + str(runTime) + "s") print(r, g, b)
Résultat sous Ubuntu 20.04 :Citation:
runtime mss: 0.014176299999999989s
255 255 255
runtime PIL.ImageGrab : 0.0403419s
255 255 255
Ami calmant, J.PCitation:
runtime mss: 0.004336402000035378s
79 75 65
runtime PIL.ImageGrab : 0.01197784200002161s
79 75 65
Merci Juju !
Je ne connaissais pas mss ! :ccool:
Windows est tellement mal optimisé... La "composition du bureau" (dwm.exe) ralenti énormément la commande ctypes dédiée à la capture de pixel..