获得像素部分平均颜色的最快方法

时间:2015-12-31 18:02:18

标签: 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(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中完成?
我想为我的电脑+电视制作环境光,所以我需要很快处理变化。

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)开始时它就像一个魅力,但是当我将它改为不同的值时,它只会返回一个不对应的数据到屏幕上显示的内容。

0 个答案:

没有答案