2011-01-07 9 views
2

Ich habe einige Bilder mit Transparenz, die ich aus dem Dateisystem in UIImageView Ansichten geladen habe. Zu meinem Zweck muss ich das Bild in der UIImageView mit der Datei auf dem Dateisystem vergleichen. Also mache ich etwas wie das Folgende:UIImagePNGRepresentation() gibt verschiedene Bytes zurück

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); 
} 

Ich weiß, dass sie PNG-Bilder sind. Keine der Beschreibungen ist NULL, wenn ich sie drucke. Aber sie sind ungleich.

Warum passiert das?

Antwort

5

Sie können nicht auf die PNG-Darstellung eines Bildes zählen, das Bit für Bit bleibt. Es gibt mehrere Möglichkeiten, dasselbe Bild zu kodieren, und wahrscheinlich gibt es auch Metadaten, die zwischen den Kodierungen wechseln können.

Stattdessen können Sie möglicherweise die Bilder Pixel für Pixel vergleichen. Siehe die folgenden um die Pixeldaten eines UIImage zu erhalten: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

+0

Danke Daniel! –

1

UIImagePNGRepresentation() wandelt ein Bild in seiner generischen typ-agnostischen Form in ein PNG mit standardisierten Einstellungen um. Mehrere PNG-Dateien können identische Bilder kodieren, und wenn Sie in einem PNG lesen, verlieren Sie die zugehörigen Metadaten, die dann (möglicherweise anders) neu erstellt werden, wenn Sie eine neue PNG-Datei schreiben.

Was möchten Sie erreichen? Sagen Sie uns und wir können Ihnen eine bessere Lösung für Ihr Problem geben.

+0

Danke für die Antwort. Hier ist, was ich versuche zu tun: Ich habe eine Liste von Ressourcen, die mit einem MD5-Hash gespeichert sind und ich muss das Bild suchen, das basierend auf diesem Hash ausgewählt ist. Die MD5-Methode, die ich verwende, erfordert ein 'NSData'-Objekt. Also das Problem: wenn die 'NSData' nicht gleich sind, ist der Hash entsprechend anders und ich finde keine passende Ressource. –

+2

Können Sie es ausarbeiten? Auf dieser Grundlage müssen Sie die Art und Weise, wie Sie Ihre Ressourcen nachschlagen, überdenken, da das Erstellen eines neuen Images ressourcenintensiv ist und Ihnen nur selten die richtige Antwort gibt. –

+0

Danke Jonathan - Ich habe ein aktuelles Bild gesucht, anstatt ein neues zu schreiben. Ich denke, basierend auf Ihrer Antwort und Daniels muss ich den Hash der Bilder in einem (separaten) Array speichern, in dem ich nachschlagen kann. –