我正在尝试比较两个UIImages。如果我这样比较:
if ([UIImagePNGRepresentation ( holderImage) isEqualToData:UIImagePNGRepresentation([UIImage imageNamed:@"empty_image.png"])])
NSLog(@"empty image");
else
NSLog(@"not empty image");
结果是YES,他们是等于
如果我正在做以下
` if ([holderImage isEqual:[UIImage imageNamed:@"empty_image.png"]])
NSLog(@"empty image");
else
NSLog(@"not empty image"); `
结果是NO,他们不是
情况非常复杂,因为:
1)图像必须(这意味着我非常肯定)相等所以我会相信第一个,除非
2)isEqual比较总是在其他图像上给出真实的结果。
所以我完全糊涂了。你觉得怎么样?顺便说一句,holderImage刚从NSUserDefaults中获取。您是否认为在存储在NSUserDefaults中时可能会以某种方式进行更改,以便isEqual比较现在正在进行中?
答案 0 :(得分:7)
isEqual
上的UIImage
方法看起来是对象的指针/散列,而isEqual
上的NSData
方法看起来字节是相同的。< / p>
大多数对象使用的isEqual
基于hash。在Apple文档中,指定NSData
以不同的方式实现isEqual
方法。
如果两个数据对象保持相同的字节数,并且对象中相同位置的字节相同,则它们是相等的。
答案 1 :(得分:4)
PivotalCoreKit提供helper用于通过字节比较图像。如果图像是通过不同来源(例如[UIImage -UIImageNamed]
和[UIImage initWithData:]
创建的,则会通过,与UIImagePNGRepresentation()
不同。
- (BOOL)isEqualToByBytes:(UIImage *)otherImage {
NSData *imagePixelsData = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage));
NSData *otherImagePixelsData = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(otherImage.CGImage));
BOOL comparison = [imagePixelsData isEqualToData:otherImagePixelsData];
CGDataProviderRelease((CGDataProviderRef)imagePixelsData);
CGDataProviderRelease((CGDataProviderRef)otherImagePixelsData);
return comparison;
}