Моя функция GetPixel очень медленная, правильно ли я это делаю? - PullRequest
0 голосов
/ 15 января 2020
def get_pixel_colour(self, i_x, i_y):
    i_desktop_window_id = win32gui.GetDesktopWindow()
    i_desktop_window_dc = win32gui.GetWindowDC(i_desktop_window_id)
    long_colour = win32gui.GetPixel(i_desktop_window_dc, i_x, i_y)
    i_colour = int(long_colour)
    return (i_colour & 0xff), ((i_colour >> 8) & 0xff), ((i_colour >> 16) & 0xff)

Это в основном то, что у меня есть, но кто-то другой написал это.

Мне известен такой подход , и я написал версию своего кода с использованием PIL , он работает нормально.

Однако я пытаюсь улучшить производительность моего кода. Есть ли способ сделать это

, но по-другому? Я пытаюсь избежать PIL или функции

color = GetPixel(hDC, p.x, p.y)

.

Есть ли подход под названием "BitBlt?

1 Ответ

1 голос
/ 15 января 2020

Три вещи, которые вы можете сделать, чтобы улучшить производительность:

  • Если вы вызываете свою функцию get_pixel_colour в узком l oop (например, один раз для каждого пикселя), то вы несут избыточные накладные расходы на вызов GetDesktopWindow и GetWindowD C для каждого пикселя. Извлекайте D C один раз для каждого кадра, а не для каждого пикселя.

  • Кроме того, только издержки вызова самой функции могут искажать результаты. Не уверен, как Python оптимизирует код, но вызов функции на пиксель в изображении также является убийцей. Поэтому часто лучше просто встроить код, который напрямую вызывает GetPixel, вместо того, чтобы обернуть его функцией.

  • Наконец, сам GetPixel, скорее всего, является тяжеловесным вызовом. Лучшим подходом было бы переместить весь рабочий стол в буфер памяти один раз. Затем переберите RGB-байты в буфере памяти. Посмотрите на этот ответ здесь: Как получить изображение экрана в буфер памяти?

...