我只用PIL才做到了。
一些注意事项:这是一个像素完美的搜索。它只是寻找匹配的RGB像素。
为了简单起见,我删除了alpha/transparency通道。我只寻找RGB像素。
此代码将整个子图像像素数组加载到内存中,同时将大图像保留在内存之外。在我的系统中,Python在1920x1200屏幕截图中为一个小40x30子图像搜索保留了大约26mib的内存。
这个简单的例子不是很有效,但是提高效率会增加复杂性。在这里,我把事情说得直截了当,容易理解。
这个例子适用于Windows和OSX。未在Linux上测试。它只拍摄主显示器的屏幕截图(用于多监视器设置)。
代码如下:import os
from itertools import izip
from PIL import Image, ImageGrab
def iter_rows(pil_image):
"""Yield tuple of pixels for each row in the image.
From:
http://stackoverflow.com/a/1625023/1198943
:param PIL.Image.Image pil_image: Image to read from.
:return: Yields rows.
:rtype: tuple
"""
iterator = izip(*(iter(pil_image.getdata()),) * pil_image.width)
for row in iterator:
yield row
def find_subimage(large_ima