Два способа сравнения UIImages показывают разные результаты.Кому верить? - PullRequest
5 голосов
/ 04 января 2012

Я пытаюсь сравнить два UIImages. Если я сравниваю это так:

if ([UIImagePNGRepresentation ( holderImage) isEqualToData:UIImagePNGRepresentation([UIImage imageNamed:@"empty_image.png"])])
            NSLog(@"empty image");
        else
            NSLog(@"not empty image");

результат ДА, ОНИ РАВЕН

если я делаю следующее

` if ([holderImage isEqual:[UIImage imageNamed:@"empty_image.png"]])
            NSLog(@"empty image");
        else
            NSLog(@"not empty image"); `

результат НЕТ, ОНИ НЕ

Ситуация довольно сложная, потому что:

1) Изображения ДОЛЖНЫ БЫТЬ (это значит, что я почти уверен) равны, поэтому я бы поверил первому, если

2) Сравнение isEqual всегда дает истинный результат на других изображениях.

Так что я в полном замешательстве. Что ты об этом думаешь? Кстати, держательImage был только что взят из NSUserDefaults. Как вы думаете, это может быть как-то изменено при хранении в NSUserDefaults, так что сравнение isEqual теперь ложно?

Ответы [ 2 ]

7 голосов
/ 04 января 2012

Метод isEqual в UIImage ищет указатель / хэш объекта, где метод isEqual в NSData будет выглядеть так, что байты совпадают.

isEqual, используемый большинством объектов, основан на хеш . В документации Apple указано, что NSData реализует метод isEqual другим способом.

Два объекта данных равны, если они содержат одинаковое количество байтов, и если байты в одной и той же позиции в объектах одинаковы.

4 голосов
/ 04 февраля 2014

PivotalCoreKit предоставляет помощник для сравнения изображений с помощью байтов.Это пройдет, если изображения созданы из разных источников (например, [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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...