#!/usr/bin/env python

# Usage: get_diffmetric.py img1 img2
#
# Helper script that calculates the DiffMetric between two given images.
# For debugging purposes only.
#
# Note: This requires PIL or Pillow to be installed.

import sys
from PIL import Image

## Main program.
img1_path = sys.argv[1]
img2_path = sys.argv[2]

img1 = Image.open(img1_path)
img2 = Image.open(img2_path)
has_alpha = (img1.mode == img2.mode)

xMin = min(img1.size[0], img2.size[0])
yMin = min(img1.size[1], img2.size[1])
xMax = max(img1.size[0], img2.size[0])
yMax = max(img1.size[1], img2.size[1])

px_img1 = img1.load()
px_img2 = img2.load()

num_diff_pixel = xMax * yMax
max_rgba_diff = [0, 0, 0, 0]


for x in xrange(xMin):
    for y in xrange(yMin):
        p1 = (px_img1[x, y] + (0xFF,))[:4]
        p2 = (px_img2[x, y] + (0xFF,))[:4]

        if (p1 != p2) or not has_alpha:
            for channel in range(len(p1)):
                pdiff = abs(p1[channel]-p2[channel])
                max_rgba_diff[channel] = max(max_rgba_diff[channel], pdiff)
        else:
            num_diff_pixel -= 1

image_sizes_differ = (img1.size[0] != img2.size[0]) or (img1.size[1] != img2.size[1])
total_px = xMax * yMax
pixel_diff_percent = (num_diff_pixel / float(total_px)) * 100
if pixel_diff_percent > 100.0:
    print "Error: Percent difference > 100%"

print "Image Sizes Differ:", image_sizes_differ
print "TotalNumPixels:    ", total_px
print "NumDiffPixels:     ", num_diff_pixel
print "PixelDiffPercent:  ", pixel_diff_percent
print "MaxRGBADiffs:      ", max_rgba_diff
