Моя функция GetPixel работает очень медленно, правильно ли я ее использую?

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?


person Michael C    schedule 15.01.2020    source источник


Ответы (1)


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

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

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

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

person selbie    schedule 15.01.2020