更快阅读桌面颜色信息

时间:2016-01-18 19:47:55

标签: python windows winapi hwnd

有没有办法实现比我写的更快的色彩阅读?

class MyApi:
    def __init__(self):
        self.width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
        self.height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
        self.left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
        self.top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
        self.hwin = win32gui.GetDesktopWindow()
        self.hwindc = win32gui.GetWindowDC(self.hwin)
        self.srcdc = win32ui.CreateDCFromHandle(self.hwindc)

        self.memdc = self.srcdc.CreateCompatibleDC()

        self.bmp = win32ui.CreateBitmap()
        self.bmp.CreateCompatibleBitmap(self.srcdc, self.width, self.height)
        self.memdc.SelectObject(self.bmp)

    def get_xy_color(self, *args):
        self.memdc.BitBlt((0, 0), (self.width, self.height), self.srcdc, (self.left, self.top), win32con.SRCCOPY)
        bmp = self.bmp.GetBitmapBits(False)
        # colors = []
        # for pixel in args:
        #     tmp = (pixel[1] * self.width + pixel[0]) * 4
        #     colors += [255 + c if c < 0 else c for c in bmp[tmp:tmp+3]][::-1]
        # return colors

取消注释get_xy_color部分需要大约0.11 ms - 这对我来说太长了。可以更快吗?

BitBlt非常快,但GetBitmapBits需要很长时间 我也可以说我不需要整个屏幕信息,如果我能得到它的一部分,我会很高兴,例如从点(100, 100)(150, 150)

目的是为Ambilight项目每秒至少获取30次颜色。

1 个答案:

答案 0 :(得分:1)

在这里你去了jotto:

    self.bmp = win32ui.CreateBitmap()
    self.bmp.CreateCompatibleBitmap(self.srcdc, self.width, 80)
    self.memdc.SelectObject(self.bmp)

def get_xy_color(self, left, right):
    self.memdc.BitBlt((0, -500), (self.width, 580), self.srcdc, (self.left, self.top), win32con.SRCCOPY)
    bmp = self.bmp.GetBitmapBits(False)

这将集中在高度和屏幕全宽500到500像素之间的一条线上。我只是不知道我可以使用负值。我已经通过将位图保存为文件并寻求良好的解决方案来检查如何执行此操作。

现在我不会将整个屏幕进行处理,并将时间缩短到10到20毫秒之间。这对我来说是完美的结果。

代码的目的是针对AmbiLight项目。颜色通过串口发送到Arduino,后者将其转换为LED颜色。

通过这个解决方案,我可以在39到60之间做到并发送给Arduino - 结果很好。