2012-06-26 2 views
8

У меня возник вопрос о сравнении UIImages в Objective-C, когда одно изображение уже прошло через процесс сохранения и загрузки с использованием метода NSSearchPathForDirectoriesInDomains.Objective-C: Сравнение изображения с другим ранее сохраненным изображением

Целью того, что я хочу, является направить пользователя на новый экран по щелчку в зависимости от того, что отображает изображение.

Для простоты предположим, что есть две возможности - черное изображение и зеленое изображение. Щелчок по черному изображению приведет вас к xib1, и щелчок по зеленому изображению приведет вас к xib2.

Это достаточно просто и работает до тех пор, пока я не реализовал систему сохранения и загрузки.

Чтобы сохранить меня сделать следующее:

paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
documentsDirectory = [paths objectAtIndex:0]; 
pngFilePath = [NSString stringWithFormat:@"%@/test.png",documentsDirectory]; 
data1 = [NSData dataWithData:UIImagePNGRepresentation([level1part1 objectAtIndex:0])]; 
[data1 writeToFile:pngFilePath atomically:YES]; 

и нагрузить я сделать следующее:

paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
documentsDirectory = [paths objectAtIndex:0]; 
pngFilePath = [NSString stringWithFormat:@"%@/test.png",documentsDirectory]; 
UIImage *image = [UIImage imageWithContentsOfFile:pngFilePath]; 
[button1 setImage:image forState:UIControlStateNormal]; 

Это нормально, и когда я выйти из программы и перезапустить его изображение сохраняется на на экране, как я хочу. Гипотетически предположим, что изображение, появившееся на кнопке 1, является зеленым.

Когда я звоню следующий код после нажатия на кнопку с идентификатором отправителя (это button1):

if(sender.currentImage == [UIImage imageNamed:self.greenImage]) 
{ 
    VisitAlreadyCorrectScreen *screen = [[VisitAlreadyCorrectScreen alloc] initWithNibName:nil bundle:nil]; 
    screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [self presentModalViewController:screen animated:YES]; 
} 

даже если currentImage является зеленый образ и та же картина, как зеленый изображение I я сравнивая его, я думаю, потому что я сохранил зеленый образ в память в процессе сохранения сравнение не работает, как они проводятся в разных местах, в памяти - проверяются следующим NSLog:

Current Image: <UIImage: 0x95614c0>, and Yes Image: <UIImage: 0xde748f0> 

I не могут решить, как сравнивать два изображения, так что что в этом случае они совпадают (оба они относятся к одному и тому же изображению, которое у меня есть в папке ресурсов). У кого-нибудь есть предложения вообще?

Пожалуйста, дайте мне знать, если я недостаточно хорошо объяснил, в чем проблема!

Заранее благодарен!

+0

Если вам не нужно 100% сравнение пополам, вы можете использовать это, что примерно в 50 раз быстрее, чем решение Paul N: http://stackoverflow.com/a/19668235/423171 – cprcrack

+0

Это может быть стоит рассмотреть возможность расширения UIImage для добавления некоторых полей идентификаторов и методов сравнения. (Не уверен, как будет расширен расширенный UIImage.) –

ответ

25

Вы можете сравнить изображение или URL-адрес изображения, если он был загружен из Интернета, он также будет быстрее, чем сравнение изображений.

Кроме того, проблема заключается в том, что с помощью оператора == вы сравниваете адреса памяти изображений 0x95614c0 и 0xde748f0. Вот почему он не равен. Вы сравниваете, являются ли они одним и тем же объектом, а не изображениями.

Для сравнения используются изображения: Как уже упоминалось в сообщении Fls'Zen.

if ([UIImagePNGRepresentation(blackImage) isEqualToData:UIImagePNGRepresentation(greenImage)]) 
+0

Привет, Пол - спасибо за ваш ответ. Я использовал теги для идентификации между различными кнопками, которые содержат мои изображения, и это прекрасно работает, но вы можете даже пометить изображение? Кроме того, код, который вы предоставили, я уже пробовал в своем коде, но не понял, что он такой же. – user1309044

+0

Вы правы, я не могу догадаться, что я запутался в ImageView, я также подтвердил, что метод isEqual не работает для изображений, так как он также сравнивает указатель объекта, я извиняюсь за указание вас в неправильном направлении , Я обновил свой ответ единственным методом, который я нашел для сравнения изображений. –

+0

Не волнуйтесь Пол - благодарен за ответ в первую очередь! – user1309044

4

Ваши изображения, разумеется, имеют разные адреса, поскольку один из них загружен из вашего пакета приложений и один загружается из каталога документов. Функция [UIImage imageNamed:] возвращает только изображения из набора приложений.

Если вы действительно хотите сравнить изображения по содержанию, зарегистрируйтесь this SO вопрос. В первом ответе вычисляется значение хэш-функции s для изображения. В вашем коде вы можете сравнить хэш-значения двух изображений, которые у вас есть.Второй ответ сравнивает изображения напрямую, в случае, если хеши заставляют вас нервничать.

Я рекомендую пойти другим путем и иметь трек вашего приложения, изображение которого загружается вне самого изображения.

+1

Привет, Fls'Zen - спасибо за ваш ответ. Я взглянул на ссылку, которую вы упомянули, и хотя первый метод казался довольно экстравагантным для довольно тривиальной задачи (которую я должен был бы повторить много раз), я попытался использовать второй метод, который вы указали мне тоже, который, к сожалению, не работал либо (они не совпадали). Я мог бы просто создать bool или двоичный массив, который обновляется всякий раз, когда изображение изменяется и основывает мое действие на значении этой переменной. Я буду держать вопрос открытым, если у кого-то есть какие-то дальнейшие ответы - спасибо за ответ, который он очень ценит! – user1309044

Смежные вопросы