2009-11-06 14 views
20

Estoy tratando de comparar dos UIImages del sistema de archivos para ver si son los mismos. Obviamente, no puedo usar el método hash de NSObject, ya que esto devuelve un hash del objeto, y no los datos de imagen reales.Generar hash desde UIImage

Encontré el código para generar un hash MD5 a partir de una cadena, pero no he descubierto cómo implementarlo para un UIImage.

¿Cómo debo hacer hashing a UIImage? ¿O mi método para comparar imágenes está totalmente desconectado?

Respuesta

35

Terminé usando el siguiente código para realizar la tarea. Tenga en cuenta que esto requiere que importe <CommonCrypto/CommonDigest.h>:

unsigned char result[CC_MD5_DIGEST_LENGTH]; 
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(inImage)]; 
CC_MD5([imageData bytes], [imageData length], result); 
NSString *imageHash = [NSString stringWithFormat: 
         @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
         result[0], result[1], result[2], result[3], 
         result[4], result[5], result[6], result[7], 
         result[8], result[9], result[10], result[11], 
         result[12], result[13], result[14], result[15] 
         ]; 
+4

Tal vez una pregunta estúpida pero requiere la verificación "He añadido criptografía" en el envío de App Store? – david

+0

No puedo hablar en todos los casos, sin embargo, cuando envié mi aplicación, no marqué esa casilla. Acabo de usar el hash para comparar dos imágenes, no para ningún tipo de encriptación de datos. –

+1

Para mí, esto generó un hash diferente en cada pase. El uso de [bytes de imageData] como primer argumento para CC_MD5 parece solucionarlo. –

7

A menos de solución óptima:

[ UIImagePNGRepresentation(uiImage1) isEqualToData: 
     UIImagePNGRepresentation(uiImage2) ]; 

Esto básicamente compara los datos PNG codificada de la 2 imágenes. Dado que la similitud de la imagen es un tema complejo, se pueden idear soluciones mejores y más rápidas basándose exactamente en el objetivo final (es decir, si está buscando comparar imágenes, píxel por píxel o similitud aproximada, que podría usar una versión reducida de la fuente imagen, etc.).

+0

Entonces, ¿cómo deberíamos ir a por similitud aproximada decir hasta el 90% similarity.I trató el RGB se acerca, pero es un proceso que lleva mucho tiempo cuando tienes alrededor de 1000 imágenes en tu galería y necesitas comparar unas con otras. – Imran

+0

¿Su código funciona con archivos JPG? – user2924482

+0

Sí, sería user2924482, convierte el archivo a los datos png equivalentes de la uiimage que va a pasar, no importa qué tipo de tipo de archivo es –

1

código más elegante a continuación

+(NSString *)MD5HexDigest:(NSData *)input { 
 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
 

 
    CC_MD5(input.bytes, (unsigned int)input.length, result); 
 
    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; 
 
    for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) { 
 
     [ret appendFormat:@"%02x",result[i]]; 
 
    } 
 
    return ret; 
 
}

Cuestiones relacionadas