15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Compare two images for equality."""
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from PIL import Image
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from PIL import ImageChops
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Compare(file1, file2, **kwargs):
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Compares two images to see if they're identical.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Args:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file1: path to first image to compare
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file2: path to second image to compare
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kwargs: unused for this operator
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Returns:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    None if the images are identical
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A tuple of (errorstring, image) if they're not
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kwargs = kwargs  # unused parameter
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  im1 = Image.open(file1)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  im2 = Image.open(file2)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if im1.size != im2.size:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("The images are of different size (%s vs %s)" %
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (im1.size, im2.size), im1)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  diff = ImageChops.difference(im1, im2)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if max(diff.getextrema()) != (0, 0):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("The images differ", diff)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
38