92 lines
4.2 KiB
Mathematica
92 lines
4.2 KiB
Mathematica
|
//
|
||
|
// Created by Gabriel Handford on 3/1/09.
|
||
|
// Copyright 2009-2013. All rights reserved.
|
||
|
// Created by John Boiles on 10/20/11.
|
||
|
// Copyright (c) 2011. All rights reserved
|
||
|
// Modified by Felix Schulze on 2/11/13.
|
||
|
// Copyright 2013. All rights reserved.
|
||
|
//
|
||
|
// Permission is hereby granted, free of charge, to any person
|
||
|
// obtaining a copy of this software and associated documentation
|
||
|
// files (the "Software"), to deal in the Software without
|
||
|
// restriction, including without limitation the rights to use,
|
||
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
// copies of the Software, and to permit persons to whom the
|
||
|
// Software is furnished to do so, subject to the following
|
||
|
// conditions:
|
||
|
//
|
||
|
// The above copyright notice and this permission notice shall be
|
||
|
// included in all copies or substantial portions of the Software.
|
||
|
//
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||
|
//
|
||
|
|
||
|
#import "UIImage+Compare.h"
|
||
|
|
||
|
@implementation UIImage (Compare)
|
||
|
|
||
|
- (BOOL)compareWithImage:(UIImage *)image
|
||
|
{
|
||
|
NSAssert(CGSizeEqualToSize(self.size, image.size), @"Images must be same size.");
|
||
|
|
||
|
// The images have the equal size, so we could use the smallest amount of bytes because of byte padding
|
||
|
size_t minBytesPerRow = MIN(CGImageGetBytesPerRow(self.CGImage), CGImageGetBytesPerRow(image.CGImage));
|
||
|
size_t referenceImageSizeBytes = CGImageGetHeight(self.CGImage) * minBytesPerRow;
|
||
|
void *referenceImagePixels = calloc(1, referenceImageSizeBytes);
|
||
|
void *imagePixels = calloc(1, referenceImageSizeBytes);
|
||
|
|
||
|
if (!referenceImagePixels || !imagePixels) {
|
||
|
free(referenceImagePixels);
|
||
|
free(imagePixels);
|
||
|
return NO;
|
||
|
}
|
||
|
|
||
|
CGContextRef referenceImageContext = CGBitmapContextCreate(referenceImagePixels,
|
||
|
CGImageGetWidth(self.CGImage),
|
||
|
CGImageGetHeight(self.CGImage),
|
||
|
CGImageGetBitsPerComponent(self.CGImage),
|
||
|
minBytesPerRow,
|
||
|
CGImageGetColorSpace(self.CGImage),
|
||
|
(CGBitmapInfo)kCGImageAlphaPremultipliedLast
|
||
|
);
|
||
|
CGContextRef imageContext = CGBitmapContextCreate(imagePixels,
|
||
|
CGImageGetWidth(image.CGImage),
|
||
|
CGImageGetHeight(image.CGImage),
|
||
|
CGImageGetBitsPerComponent(image.CGImage),
|
||
|
minBytesPerRow,
|
||
|
CGImageGetColorSpace(image.CGImage),
|
||
|
(CGBitmapInfo)kCGImageAlphaPremultipliedLast
|
||
|
);
|
||
|
|
||
|
CGFloat scaleFactor = [UIScreen mainScreen].scale;
|
||
|
CGContextScaleCTM(referenceImageContext, scaleFactor, scaleFactor);
|
||
|
CGContextScaleCTM(imageContext, scaleFactor, scaleFactor);
|
||
|
|
||
|
if (!referenceImageContext || !imageContext) {
|
||
|
CGContextRelease(referenceImageContext);
|
||
|
CGContextRelease(imageContext);
|
||
|
free(referenceImagePixels);
|
||
|
free(imagePixels);
|
||
|
return NO;
|
||
|
}
|
||
|
|
||
|
CGContextDrawImage(referenceImageContext, CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), self.CGImage);
|
||
|
CGContextDrawImage(imageContext, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage);
|
||
|
CGContextRelease(referenceImageContext);
|
||
|
CGContextRelease(imageContext);
|
||
|
|
||
|
BOOL imageEqual = (memcmp(referenceImagePixels, imagePixels, referenceImageSizeBytes) == 0);
|
||
|
free(referenceImagePixels);
|
||
|
free(imagePixels);
|
||
|
return imageEqual;
|
||
|
}
|
||
|
|
||
|
@end
|