Python 获取像素平均颜色的最快方法

Python 获取像素平均颜色的最快方法,python,winapi,win32gui,python-3.5,Python,Winapi,Win32gui,Python 3.5,如何以更快的方式读取屏幕上显示的部分的平均RGB颜色? 我一直在尝试使用这个: class DesktopWindow(object): def __init__(self, *args, **kwargs): self.window_id = win32gui.GetDesktopWindow() self.window_dc = win32gui.GetWindowDC(self.window_id) def get_pixel_color(

如何以更快的方式读取屏幕上显示的部分的平均RGB颜色?
我一直在尝试使用这个:

class DesktopWindow(object):
    def __init__(self, *args, **kwargs):
        self.window_id = win32gui.GetDesktopWindow()
        self.window_dc = win32gui.GetWindowDC(self.window_id)

    def get_pixel_color(self, i_x, i_y):
        long_colour = win32gui.GetPixel(self.window_dc, i_x, i_y)
        i_colour = int(long_colour)
        return [i_colour & 0xff, (i_colour >> 8) & 0xff, (i_colour >> 16) & 0xff]
但是读取40个像素的值也要花费大量的时间。根据颜色的不同,它最长可达700毫秒

或者我应该换一种不同的语言,因为它不能用Python实现?
我想为我的PC+电视制作环境光,所以我需要快速处理更改

while 1:
    color = [0, 0, 0]
    for x in range(0, 1920, 256):
        for y in range(0, 1080, 256):
            color = list(map(add, color, dtop.get_pixel_color(x, y)))
    color = [int(color[0]/8/5), int(color[1]/8/5), int(color[2]/8/5)]
    ser.write([0xff] + color)

编辑:

我找到了这样的解决方案:

import win32api
import win32con
import win32gui
import win32ui

width = 5  # win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = 5  # win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
print(left, top)
print(width, height)
hwin = win32gui.GetDesktopWindow()
hwindc = win32gui.GetWindowDC(hwin)
srcdc = win32ui.CreateDCFromHandle(hwindc)

memdc = srcdc.CreateCompatibleDC()

bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, 1920, 1080)
memdc.SelectObject(bmp)

memdc.BitBlt((100, 100), (width, height), srcdc, (left, top), win32con.SRCCOPY)
bmpinfo = bmp.GetInfo()
bmpInt = bmp.GetBitmapBits(False)
rgb = [bmpInt[i:i+3] for i in range(0, len(bmpInt), 4)]
#print(bmpInt)
for r in rgb:
    if not r == (0, 0, 0):
        print(r)

但我无法衡量这是否更快,因为我无法让它与所需的部分一起工作。当我从BitBlt的点(0,0)开始时,它就像一个符咒,但当我将它更改为不同的值时,它只返回一个与屏幕上显示的数据不对应的buch。

使用
GetDIBits
一次性将DC内容读取到缓冲区
GetPixel
效率极低。您能告诉我如何在Python中使用它吗?我对Windows不太熟悉openCV怎么样?也许这会更快?