| # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Compare two images for equality, subject to a mask.""" |
| |
| from PIL import Image |
| from PIL import ImageChops |
| |
| import os.path |
| |
| |
| def Compare(file1, file2, **kwargs): |
| """Compares two images to see if they're identical subject to a mask. |
| |
| An optional directory containing masks is supplied. If a mask exists |
| which matches file1's name, areas under the mask where it's black |
| are ignored. |
| |
| Args: |
| file1: path to first image to compare |
| file2: path to second image to compare |
| kwargs: ["maskdir"] contains the directory holding the masks |
| |
| Returns: |
| None if the images are identical |
| A tuple of (errorstring, image) if they're not |
| """ |
| |
| maskdir = None |
| if "maskdir" in kwargs: |
| maskdir = kwargs["maskdir"] |
| |
| im1 = Image.open(file1) |
| im2 = Image.open(file2) |
| |
| if im1.size != im2.size: |
| return ("The images are of different size (%r vs %r)" % |
| (im1.size, im2.size), im1) |
| |
| diff = ImageChops.difference(im1, im2) |
| |
| if maskdir: |
| maskfile = os.path.join(maskdir, os.path.basename(file1)) |
| if os.path.exists(maskfile): |
| mask = Image.open(maskfile) |
| |
| if mask.size != im1.size: |
| return ("The mask is of a different size than the images (%r vs %r)" % |
| (mask.size, im1.size), mask) |
| |
| diff = ImageChops.multiply(diff, mask.convert(diff.mode)) |
| |
| if max(diff.getextrema()) != (0, 0): |
| return ("The images differ", diff) |
| else: |
| return None |