【发布时间】:2016-01-18 19:47:54
【问题描述】:
有什么方法可以比我写的更快地读取颜色?
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)。
目的是为流光溢彩项目每秒至少获得 30 次颜色。
【问题讨论】:
-
应该迁移到 Code Review 吗?
-
这对Code Review 来说可能是个好问题,只要:(A) 代码有效,和(B ) 这绝不是假设性的或不完整的。发帖前请阅读on-topic guide,如果你选择去Code Review。如果您有任何问题或疑虑,请通过CR Help Desk 加入我们。
-
“这对我的目的来说太长了” - 那么,你的目的是什么?在不知道您要解决的问题的情况下,我们无法推荐解决方案。
-
所以对我来说建议将问题迁移到 CodeRevies,但是这个stackoverflow.com/questions/34872664/… 问题已迁移到 SO。我认为这种困境几乎是一样的。甚至我更适合,因为我要求更快的东西(我知道有更快的东西)并且在提到的问题中只有两种方法的比较。很奇怪。
-
我建议你清楚地描述你想要完成的事情。你写了环境光项目。颜色应该来自哪里?我的第一种方法是从屏幕边框获取视图样本。也许在 hdc 0 上调用几个 GetPixel 就足够了。
标签: python windows winapi hwnd