我需要在屏幕上或活动窗口中获取某些像素的颜色,我需要 快速 。我尝试过使用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.我看了,但无法弄清楚如何做到这一点。
谢谢!
答案 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)