Быстрое получение цвета некоторых пикселей на экране в Python в Windows 7

мне нужно получить цвет некоторых пикселей на экране или в активном окне, а мне нужно сделать так быстро. Я пробовал использовать win32gui и ctypes / windll, но они слишком медленные. Каждая из этих программ получает цвет 100 пикселей:

import win32gui
import time
time.clock()
for y in range(0, 100, 10):
    for x in range(0, 100, 10):
        color = win32gui.GetPixel(win32gui.GetDC(win32gui.GetActiveWindow()), x , y)
print(time.clock())

и

from ctypes import windll
import time
time.clock()
hdc = windll.user32.GetDC(0)
for y in range(0, 100, 10):
    for x in range(0, 100, 10):
        color = windll.gdi32.GetPixel(hdc, x, y)
print(time.clock())

каждый из них занимает около 1.75 секунд. Мне нужна такая программа, которая займет менее 0,1 секунды. Почему так медленно?

Я работаю с В Python 3.x и Windows 7. Если ваше решение требует, я использую Python 2.x, пожалуйста, свяжите меня со статьей, показывающей, как иметь Python 3.x и 2.х установлены. Я посмотрел, но не мог понять, как это сделать.

спасибо!

4 ответов


У меня была такая же точная проблема, и я решил ее (в Java, В C#). Основная идея решения-GetPixel с экрана медленно, и вы не можете это исправить. Но поскольку вам нужны некоторые пиксели,вы можете получить их все сразу.

время, необходимое для получения 64 пикселей, было в 98 раз быстрее.


благодаря направлению Маргуса я сосредоточился на получении изображения перед извлечением информации о пикселях. Вот работоспособное решение с использованием библиотека изображений Python (PIL), для чего требуется Python 2.x.

import ImageGrab
import time
time.clock()
image = ImageGrab.grab()
for y in range(0, 100, 10):
    for x in range(0, 100, 10):
        color = image.getpixel((x, y))
print(time.clock())

Я не думаю, что это станет проще. Это занимает (в среднем) на 0,1 секунды, что немного медленнее, чем хотелось бы, но достаточно быстро.

Что касается наличия Python 3.x и 2.x оба установлены, я разделил это на новый вопрос. У меня все еще есть некоторые проблемы с этим, но в целом это работает.


это лучше, чем с помощью getpixel все время и работает быстрее.

import ImageGrab

px=ImageGrab.grab().load()
for y in range(0,100,10):
    for x in range(0,100,10):
        color=px[x,y]

ссылки: изображения.загрузить


отключение композиции рабочего стола Windows ускоряет чтение пикселей МНОГО.

Компьютер - > Свойства - > Дополнительные Системные настройки - > производительность - > состав рабочего стола [ ] (предупреждение это отключает Эффекты прозрачности Windows)

Python 2.7 (должно быть одинаковым для 3.x)

win32gui.GetPixel()     #1.75s => 20ms
windll.gdi32.GetPixel() #1.75s => 3ms (fastest)
image.getpixel()        # 0.1s => 50ms
px[]                    # 0.1s => 50ms

AutoIt для сравнения

$timer = TimerInit()

For $x = 0 To 100 Step 10
    For $y = 0 To 100 Step 10
        PixelGetColor($x,$y) ;slow => 1ms
    Next
Next

ConsoleWrite("Time: " & TimerDiff($timer)/1000 & @CRLF)