2012-06-26 13 views
8

Ho una domanda sul confronto di UIImages in Objective-C quando un'immagine è già stata sottoposta a un processo di salvataggio e caricamento utilizzando il metodo NSSearchPathForDirectoriesInDomains.Objective-C: confronto di un'immagine con un'altra immagine che è stata precedentemente salvata

Lo scopo di ciò che voglio è indirizzare l'utente a una nuova schermata con un clic in base a ciò che l'immagine mostra.

Per semplicità, diciamo che ci sono due possibilità: un'immagine nera e un'immagine verde. Cliccando sull'immagine nera ti porta a xib1 e cliccando sull'immagine verde ti porta a xib2.

Questo è abbastanza semplice e ha funzionato fino a quando non ho implementato un sistema di salvataggio e caricamento.

Per salvare faccio la seguente:

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]; 

e per caricare faccio la seguente:

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]; 

Questo va bene e quando ho lasciato il programma e riavviare l'immagine viene trattenuto sulla lo schermo come vorrei che fosse. Ipoteticamente diciamo che l'immagine ora visualizzata sul pulsante 1 è l'immagine verde.

Quando chiamo il seguente codice dopo aver fatto clic sul pulsante con id di mittente (questo è button1):

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

anche se il currentImage è l'immagine verde ed è la stessa immagine come l'immagine che verde sto paragonando a, credo perché ho salvato l'immagine verde in memoria nel processo di salvataggio il confronto non funziona in quanto si svolgono in diversi luoghi della memoria - verificato dal seguente NSLog:

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

I non riesco a capire come confrontare le due immagini così che in questo caso corrispondono (entrambi si riferiscono alla stessa immagine che ho nella cartella delle risorse). Qualcuno ha qualche suggerimento?

Per favore fatemi sapere se non ho spiegato abbastanza bene qual è il problema!

Grazie in anticipo!

+0

Se non è necessario il confronto al 100% pixel per pixel, è possibile utilizzare questo, che è circa 50 volte più veloce della soluzione di Paul N: http://stackoverflow.com/a/19668235/423171 – cprcrack

+0

Potrebbe vale la pena considerare di estendere UIImage per aggiungere alcuni campi identificativi e confrontare i metodi. (Non sono sicuro di come UIImage debba essere esteso.) –

risposta

25

È possibile confrontare il nome dell'immagine o l'URL dell'immagine se è stato scaricato da Internet, ma sarà anche più veloce rispetto al confronto delle immagini.

Inoltre, il problema è che utilizzando l'operatore == si stanno confrontando gli indirizzi di memoria delle immagini 0x95614c0 e 0xde748f0. Ecco perché non è uguale. Stai confrontando se sono lo stesso oggetto, non se le immagini sono uguali.

Per confrontare l'uso delle immagini: Come accennato sulla risposta di Fls'Zen.

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

Ciao Paul - grazie per la tua risposta - Ho usato i tag per identificare tra diversi pulsanti che contengono le mie immagini e questo funziona bene ma puoi persino taggare un'immagine? Inoltre, il codice che hai fornito l'ho già provato nel mio codice senza alcun risultato, ma non riconosco che sono uguali. – user1309044

+0

Hai ragione, non puoi immaginare di essermi confuso con ImageView, ho anche confermato che il metodo isEqual non funziona per le immagini in quanto confronta anche il puntatore dell'oggetto, mi scuso per averti indirizzato in una direzione sbagliata , Ho aggiornato la mia risposta con l'unico metodo che ho trovato per confrontare le immagini allora. –

+0

Non preoccuparti Paul - sono riconoscente per la risposta in primo luogo! – user1309044

4

Le immagini hanno sicuramente indirizzi diversi poiché uno viene caricato dal pacchetto dell'applicazione e uno viene caricato dalla directory dei documenti. La funzione [UIImage imageNamed:] restituisce solo le immagini dal pacchetto di applicazioni.

Se si desidera confrontare le immagini per contenuto, consultare la domanda this SO. Nella prima risposta, un valore di hash è calcolato per un'immagine. Nel tuo codice, puoi confrontare i valori hash delle due immagini che hai.La seconda risposta confronta direttamente le immagini, nel caso in cui gli hash ti rendano nervosi.

Si consiglia di utilizzare un percorso diverso e di tenere traccia dell'applicazione con quale immagine viene caricata al di fuori dell'immagine stessa.

+1

Hi Fls'Zen - grazie per la tua risposta. Ho dato un'occhiata al link che hai menzionato e mentre il primo metodo mi sembrava abbastanza stravagante per un compito abbastanza banale (che avrei dovuto replicare numerose altre volte) ho tentato il secondo metodo che mi hai indicato anche tu che purtroppo non ha funzionato entrambi (non corrispondono). Potrei semplicemente creare un array bool o binario che si aggiorna ogni volta che l'immagine cambia e baso la mia azione sul valore di quella variabile. Terrò la domanda aperta nel caso in cui qualcuno abbia ulteriori risposte - grazie per la risposta è molto apprezzato! – user1309044

Problemi correlati