在Windows 7上用Python快速获取屏幕上某些像素的颜色

时间:2010-09-27 00:40:05

标签: python windows-7 colors screen pixel

我需要在屏幕上或活动窗口中获取某些像素的颜色,我需要 快速 。我尝试过使用win32gui和ctypes / windll,但它们太慢了。每个程序都获得100像素的颜色:

import win32gui
import time
time.clock()
for y in range(0, 100, 10):
    for x in range(0, 100, 10):
        color = win32gui.GetPixel(win32gui.GetDC(win32gui.GetActiveWindow()), x , y)
print(time.clock())

from ctypes import windll
import time
time.clock()
hdc = windll.user32.GetDC(0)
for y in range(0, 100, 10):
    for x in range(0, 100, 10):
        color = windll.gdi32.GetPixel(hdc, x, y)
print(time.clock())

每个都需要大约1.75秒。我需要这样的程序花费不到0.1秒。是什么让它如此缓慢?

我正在使用Python 3.x和Windows 7.如果您的解决方案需要我使用Python 2.x,请将我链接到一篇文章,展示如何安装Python 3.x和2.x.我看了,但无法弄清楚如何做到这一点。

谢谢!

4 个答案:

答案 0 :(得分:9)

感谢Margus的指导,我专注于在提取像素信息之前获取图像。这是一个使用Python Imaging Library (PIL)的可行解决方案,需要Python 2.x。

import ImageGrab
import time
time.clock()
image = ImageGrab.grab()
for y in range(0, 100, 10):
    for x in range(0, 100, 10):
        color = image.getpixel((x, y))
print(time.clock())

我认为它不比那更简单。这需要(平均)0.1秒,这比我想要的慢一点,但足够快。

至于安装了Python 3.x和2.x,我把它分成new question。我仍然遇到一些麻烦,但它通常都有效。

答案 1 :(得分:6)

这比使用getpixel更好,并且工作得更快。

import ImageGrab

px=ImageGrab.grab().load()
for y in range(0,100,10):
    for x in range(0,100,10):
        color=px[x,y]

参考:Image.load

答案 2 :(得分:3)

禁用Windows桌面合成会提高像素读数很多

计算机 - >属性 - >高级系统设置 - >表现 - >桌面合成[] (警告此功能会禁用Windows的透明效果)

Python 2.7(3.x应该相同)

win32gui.GetPixel()     #1.75s => 20ms
windll.gdi32.GetPixel() #1.75s => 3ms (fastest)
image.getpixel()        # 0.1s => 50ms
px[]                    # 0.1s => 50ms

AutoIt用于比较

$timer = TimerInit()

For $x = 0 To 100 Step 10
    For $y = 0 To 100 Step 10
        PixelGetColor($x,$y) ;slow => 1ms
    Next
Next

ConsoleWrite("Time: " & TimerDiff($timer)/1000 & @CRLF)

答案 3 :(得分:2)

我遇到了同样的问题,并解决了问题(in Javain C#)。解决方案背后的主要思想是来自屏幕的GetPixel很慢,你无法解决这个问题。但是当你需要一些像素时,你可以同时获得一堆像素。

获得64像素所花费的时间要快98倍。