UIImagePNGRepresentation() возвращает разные байты

У меня есть изображения с прозрачностью, которые я загружаю из файловой системы в представления UIImageView. Для моей цели мне нужно сравнить изображение в UIImageView с файлом в файловой системе. Итак, я делаю что-то вроде следующего:

NSString *directoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *imageFile = [NSString stringWithFormat:@"%@/image.png", directoryPath];

if ([[NSData dataWithContentsOfFile:imageFile] isEqualToData:UIImagePNGRepresentation([imageView image])]) {
    NSLog(@"Equal");
} else {
    NSString *dataDescription = [[[NSData dataWithContentsOfFile:feltFile] description] substringToIndex:100];
    NSString *imageDescription = [[UIImagePNGRepresentation([backgroundImageView image]) description] substringToIndex:100]
    NSLog(@"Unequal: %@ %@", dataDescription, imageDescription);
}

Я знаю, что это изображения PNG. Ни одно из описаний не является NULL, когда я его печатаю. Но они неравны.

Почему это происходит?


person Matthew Leffler    schedule 07.01.2011    source источник


Ответы (2)


Вы не можете рассчитывать на то, что PNG-представление изображения останется таким же бит за битом. Существует несколько способов кодирования одного и того же изображения, и, вероятно, также существуют метаданные, которые могут меняться между кодировками.

Вместо этого вы можете сравнивать изображения попиксельно. Для получения данных пикселей UIImage см. следующее: Как получить данные о пикселях из UIImage (Cocoa Touch) или CGImage (Core Graphics)?

person Daniel Dickison    schedule 07.01.2011

UIImagePNGRepresentation() преобразует изображение в его универсальной независимой от типа форме в PNG со стандартными настройками. Несколько файлов PNG могут кодировать идентичные изображения, и когда вы читаете PNG, вы теряете связанные метаданные, которые затем воссоздаются (возможно, по-другому) при записи нового файла PNG.

Чего вы пытаетесь достичь? Расскажите нам, и мы сможем предложить вам лучшее решение вашей проблемы.

person Jonathan Grynspan    schedule 07.01.2011
comment
Спасибо за ответ. Вот что я пытаюсь сделать: у меня есть список ресурсов, которые хранятся с хешем md5, и мне нужно найти изображение, выбранное на основе этого хеша. Метод md5, который я использую, требует объекта NSData. Таким образом, проблема: когда NSData не равно, хэш соответственно другой, и я не нахожу соответствующий ресурс. - person Matthew Leffler; 07.01.2011
comment
Можете ли вы уточнить? Основываясь только на этом, вам придется переосмыслить, как вы ищете свои ресурсы, потому что написание нового изображения требует больших ресурсов и редко дает вам правильный ответ. - person Jonathan Grynspan; 07.01.2011
comment
Спасибо, Джонатан, я искал текущее изображение, а не писал новое. Я думаю, основываясь на вашем ответе и ответе Дэниела, мне придется хранить хэш изображений в (отдельном) массиве, в котором я могу искать. - person Matthew Leffler; 10.01.2011