两种比较UIImages的方法显示不同的结果。哪一个相信?

时间:2012-01-04 10:21:55

标签: iphone uiimage

我正在尝试比较两个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比较现在正在进行中?

2 个答案:

答案 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;
}