Исходя из идеи Арофа, это моя полная реализация.Он проверяет, совпадают ли некоторые случайные пиксели.Для того, что мне было нужно, он работает безупречно.
- (bool)isTheImage:(UIImage *)image1 apparentlyEqualToImage:(UIImage *)image2 accordingToRandomPixelsPer1:(float)pixelsPer1
{
if (!CGSizeEqualToSize(image1.size, image2.size))
{
return false;
}
int pixelsWidth = CGImageGetWidth(image1.CGImage);
int pixelsHeight = CGImageGetHeight(image1.CGImage);
int pixelsToCompare = pixelsWidth * pixelsHeight * pixelsPer1;
uint32_t pixel1;
CGContextRef context1 = CGBitmapContextCreate(&pixel1, 1, 1, 8, 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst);
uint32_t pixel2;
CGContextRef context2 = CGBitmapContextCreate(&pixel2, 1, 1, 8, 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst);
bool isEqual = true;
for (int i = 0; i < pixelsToCompare; i++)
{
int pixelX = arc4random() % pixelsWidth;
int pixelY = arc4random() % pixelsHeight;
CGContextDrawImage(context1, CGRectMake(-pixelX, -pixelY, pixelsWidth, pixelsHeight), image1.CGImage);
CGContextDrawImage(context2, CGRectMake(-pixelX, -pixelY, pixelsWidth, pixelsHeight), image2.CGImage);
if (pixel1 != pixel2)
{
isEqual = false;
break;
}
}
CGContextRelease(context1);
CGContextRelease(context2);
return isEqual;
}
Использование:
[self isTheImage:image1 apparentlyEqualToImage:image2
accordingToRandomPixelsPer1:0.001]; // Use a value between 0.0001 and 0.005
Согласно моим тестам производительности, 0,005 (0,5% пикселей) являетсямаксимальное значение, которое вы должны использовать.Если вам нужна большая точность, просто сравните все изображения , используя эту .0,001 кажется безопасным и хорошо работающим значением.Для больших изображений (например, от 0,5 до 2 мегапикселей или миллионов пикселей) я использую 0,0001 (0,01%) , и он работает великолепно и невероятно быстро, никогда не ошибается.
Но, конечно, коэффициент ошибок будет зависеть от типа изображений, которые вы используете.Я использую скриншоты UIWebView, и 0,0001 работает хорошо, но вы, вероятно, можете использовать гораздо меньше, если сравниваете реальные фотографии (даже фактически сравниваете только один случайный пиксель).Если вы имеете дело с очень похожими изображениями, разработанными на компьютере, вам определенно нужна большая точность.
Примечание. Я всегда сравниваю изображения ARGB без учета альфа-канала.Возможно, вам придется адаптировать его, если это не совсем ваш случай.