首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将pyscreenshot截图中的截图与保存的截图进行比较?

如何将pyscreenshot截图中的截图与保存的截图进行比较?
EN

Stack Overflow用户
提问于 2017-08-09 03:31:14
回答 2查看 4.1K关注 0票数 0

我用python创建了一个程序,使用pyscreenshot定期截取屏幕特定区域的屏幕截图,其中包含几个预定义的图像之一。我希望将这些图像中的每一个从文件加载到一个列表中,并将它们与屏幕截图进行比较,看看哪一个是当前显示的。最初,这些文件是通过截图图像在屏幕上的方式创建的:

代码语言:javascript
运行
复制
while True:

filenm = str(i) + ".png"
im=ImageGrab.grab(bbox=(680,640,735,690)) #accross, down
im.save(filenm)
time.sleep(1)
i = i + 1

然后,当我尝试比较它们时,它总是报告为false:

代码语言:javascript
运行
复制
image2 = Image.open("04.png")

im=ImageGrab.grab(bbox=(680,640,735,690)) #accross, down

if im == image2:
    print "TRUE"
else:
    print "FALSE"

但是,将保存的两个图像与文件进行比较是可行的:

代码语言:javascript
运行
复制
image = Image.open("03.png")
image2 = Image.open("04.png")

if image == image2:
    print "TRUE"
else:
    print "FALSE"

所以我的问题是,一旦从文件中加载的图像有什么不同,我如何比较‘实时’屏幕截图和从文件中加载的图像?

EN

回答 2

Stack Overflow用户

发布于 2017-08-09 03:55:23

看起来就像我使用ImageGrab.grab()时,创建了一个PIL.Image.Image对象,而as Image.open()创建了一个PIL.pngImagePlugin.PngImageFile对象。您不希望在实际对象上调用==,因为在比较这两种对象类型时,没有为PIL图像实现特殊的语义,因此它只检查它们是否在内存中是相同的对象。我用来比较两个图像的代码(使用numpy)如下所示

代码语言:javascript
运行
复制
import numpy as np
from PIL import Image

def image_compare(image_1, image_2):
    arr1 = np.array(image_1)
    arr2 = np.array(image_2)
    if arr1.shape != arr2.shape:
        return False
    maxdiff = np.max(np.abs(arr1 - arr2))
    return maxdiff == 0

def image_compare_file(filename_1, filename_2):
    im1 = Image.load(filename_1)
    im2 = Image.load(filename_2)
    return image_compare(im1, im2)

在这里,我利用了np.array()的PIL图像自动转换为麻木ndarray。然后我检查尺寸是否匹配,如果匹配,则计算绝对误差的最大值。如果此最大值为零,则图像相同。现在你可以直接打电话给

代码语言:javascript
运行
复制
if image_compare_file('file1.png','file2.png'):
    pass # images in file are identical
else:
    pass # images differ

代码语言:javascript
运行
复制
if image_compare(image1,image2):
    pass # images are identical
else:
    pass # images differ
票数 0
EN

Stack Overflow用户

发布于 2017-08-09 04:04:18

您可能会对使用感知差异工具感兴趣,该工具可以让您快速识别屏幕截图中的差异。imgdiff是一个用Python语言封装了一个工具的库。一个简单的版本可能可以像在this answer中一样,用PIL的ImageChop实现

代码语言:javascript
运行
复制
import Image
import ImageChops

im1 = Image.open("splash.png")
im2 = Image.open("splash2.png")

diff = ImageChops.difference(im2, im1)

有关感知差异的更多信息,请查看Bret Slatkin's talk about using it for safe continuous deployment

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45576651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档