2012-06-26 7 views
8

Ich habe eine Frage zum Vergleich von UIImages in Objective-C, wenn ein Bild bereits einen Speicher- und Ladeprozess mit der NSSearchPathForDirectoriesInDomains-Methode durchlaufen hat.Objective-C: Vergleichen eines Bildes mit einem anderen Bild, das zuvor gespeichert wurde

Das Ziel von was ich will ist, den Benutzer zu einem neuen Bildschirm auf einen Klick zu führen, je nachdem, was das Bild anzeigt.

Der Einfachheit halber sagen wir, dass es zwei Möglichkeiten gibt - ein schwarzes Bild und ein grünes Bild. Wenn Sie auf das schwarze Bild klicken, gelangen Sie zu xib1. Wenn Sie auf das grüne Bild klicken, gelangen Sie zu xib2.

Das ist einfach genug und hat funktioniert, bis ich ein System zum Speichern und Laden implementiert habe.

ich folgendes zu speichern:

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

und ich folgendes zu laden:

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

Das ist in Ordnung, und wenn ich das Programm beenden und neu starten, es wird das Bild beibehalten auf der Bildschirm, wie ich es mir wünsche. Sagen wir hypothetisch, das Bild, das jetzt auf Knopf1 erscheint, ist das grüne Bild.

Wenn ich den folgenden Code aufrufen, nachdem mit der ID des Senders auf den Button klicken (dies ist button1):

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

obwohl die currentImage ist das grüne Bild und ist das gleiche Bild wie das grüne Bild I bin im Vergleich es, glaube ich, weil ich das grüne Bild in den Speicher in dem Speichervorgang der Vergleich funktioniert nicht gespeichert, wie sie an verschiedenen Orten im Speicher gehalten werden - überprüft durch die folgende NSLog:

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

I kann nicht herausfinden, wie man die beiden Bilder so vergleicht In diesem Fall stimmen sie überein (sie beziehen sich beide auf das gleiche Bild, das ich im Ressourcenordner habe). Hat jemand überhaupt irgendwelche Vorschläge?

Bitte lassen Sie mich wissen, wenn ich nicht gut genug erklärt habe, was das Problem ist!

Vielen Dank im Voraus!

+0

Wenn Sie nicht 100% Pixel-für-Pixel-Vergleich benötigen, können Sie dies verwenden, das ist etwa 50 mal schneller als Paul N Lösung: http://StackOverflow.com/a/19668235/423171 – cprcrack

+0

Es könnte Es lohnt sich, in Betracht zu ziehen, UIImage zu erweitern, um einige Bezeichnerfelder hinzuzufügen und Methoden zu vergleichen. (Nicht sicher, wie glücklich UIImage erweitert werden soll.) –

Antwort

25

Sie können den Bildnamen oder die Bild-URL vergleichen, wenn sie aus dem Internet heruntergeladen wurde. Sie ist auch schneller als der Vergleich der Bilder.

Das Problem ist auch, dass Sie mit dem Operator == die Speicheradressen der Bilder 0x95614c0 und 0xde748f0 vergleichen. Deshalb ist es nicht gleich. Sie vergleichen, ob sie das gleiche Objekt sind, nicht wenn die Bilder gleich sind.

Um Bilder zu vergleichen verwenden: Wie auf Fls'Zen Antwort erwähnt.

+0

Hallo Paul - danke für deine Antwort - Ich habe Tags verwendet, um zwischen verschiedenen Schaltflächen zu unterscheiden, die meine Bilder enthalten, und das funktioniert gut, aber kannst du sogar ein Bild markieren? Außerdem hat der Code, den Sie mir zur Verfügung gestellt haben, vergeblich versucht, sie immer noch nicht zu erkennen. – user1309044

+0

Sie haben Recht, Sie können nicht ich rate ich verwechselte mich mit dem ImageView, ich auch bestätigt, als die isEqual-Methode nicht für Bilder funktioniert, da es auch den Zeiger des Objekts vergleicht, entschuldige mich für Sie in eine falsche Richtung , Habe ich meine Antwort mit der einzigen Methode aktualisiert, die ich gefunden habe, um die Bilder dann zu vergleichen. –

+0

Keine Sorge Paul - bin dankbar für die Antwort an erster Stelle! – user1309044

4

Ihre Bilder haben sicherlich unterschiedliche Adressen, da eine aus Ihrem Anwendungspaket geladen wird und eine aus dem Dokumentenverzeichnis geladen wird. Die Funktion [UIImage imageNamed:] gibt nur Bilder aus dem Anwendungspaket zurück.

Wenn Sie wirklich die Bilder nach Inhalt vergleichen möchten, überprüfen Sie this SO Frage. In der ersten Antwort wird ein Hash-Wert s für ein Bild berechnet. In Ihrem Code könnten Sie die Hash-Werte der zwei Bilder vergleichen, die Sie haben.Die zweite Antwort vergleicht die Bilder direkt, falls Hashes Sie nervös machen.

Ich empfehle, einen anderen Weg zu gehen und Ihre Anwendung verfolgen, welches Bild außerhalb des Bildes selbst geladen wird.

+1

Hallo Fls'Zen - vielen Dank für Ihre Antwort. Ich habe mir den Link angesehen, den du erwähnt hast, und während die erste Methode für eine ziemlich triviale Aufgabe (die ich viele Male wiederholen musste) ziemlich extravagant war, habe ich die zweite Methode versucht, auf die du mich auch hingewiesen hast, die leider nicht funktioniert hat entweder (sie stimmten nicht überein). Ich könnte einfach ein bool oder binäres Array erstellen, das immer aktualisiert wird, wenn sich das Bild ändert, und meine Aktion auf den Wert dieser Variablen gründet. Ich werde die Frage offen halten, wenn jemand weitere Antworten hat - danke für die Antwort, die es sehr schätzt! – user1309044

Verwandte Themen