2013-03-13 121 views
1

我已阅读了很多关于stackowerflow的问题和解答,但仍找不到解决方案,它可以帮助解决我的问题。比较2 UIImage对象

所以我有2个真正大的图像,我需要比较它们。

图像不是用imageNamed:创建的,所以它们没有兑现,所以[image1 isEqual:image2]应该不起作用。

对它们进行比较,因为我知道唯一的解决办法是这样的一个:

- (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2 
{ 
    return [UIImagePNGRepresentation(image1) isEqual:UIImagePNGRepresentation(image2)]; 
} 

但图像有真正庞大的尺寸,所以它会采取一些时间来进行比较。

有没有什么属性可以帮助不使用上面的方法来检查它们是否相等?

例如,我可以得到image1.size并与image2.size比较,它们不相等,我不需要运行上面的方法。有任何想法吗?谢谢。

+0

无论是否被缓存如果你已经在内存不要紧其指针地址。虽然我没有尝试过,但我没有看到任何“isEqual:”不应该起作用的理由。你试过了吗? – lnafziger 2013-03-13 15:39:45

+0

如何通过从UIImage继承来创建自定义对象并将其扩展为属性e。 G。 NSString * uniqueID用于识别? – iDroid 2013-03-13 15:41:49

+0

@Inafziger:我尝试了isEqual:,没有帮助 – 2013-03-13 15:42:48

回答

6

如果您需要在像素平等,不指针比较图像,你可以这样做:

您可以创建某种哈希的每一个图像,当您创建它。例如,所有像素值的总和(可能是模数一些巨大的数字;也许是由像素位置决定的)。

然后,将该值存储在NSDictionary[image] = hashValue中。然后,当你比较图像时,首先比较它们的大小,如前所述,然后,如果它们相等,则从字典中比较它们的哈希值。

如果它们相等,则图像最可能相等,但您必须手动检查以确保100%。

手动检查可能需要一些时间,因此您可以通过发明自己的统计数据来降低碰撞的可能性(如不同图像具有相同的哈希值),如更多哈希值,不同模数,散列哈希值,左上像素值(开玩笑,但谁知道......)等等。

很明显,你有更多的统计数据,你会得到更少的冲突。 的实验场:)

否则,只是比较喜欢这个

if(image1 == image2) { 
    ... 
} 
+0

if(image1 == image2)也不适用于我的情况,但我像一些哈希的想法 – 2013-03-13 15:47:00

+0

仍然我有同样的问题,哈希拥抱图像,并检查它也将需要一些时间,所以我可以散列一些属性或部分图像 – 2013-03-13 15:48:21

+0

+1非常整洁的建议。 – Damo 2013-03-13 16:00:49