2012-06-26 23 views
8

Tengo una pregunta sobre la comparación de UIImages en Objective-C cuando una imagen ya ha pasado por un proceso de guardar y cargar utilizando el método NSSearchPathForDirectoriesInDomains.Objetivo-C: comparar una imagen con otra imagen guardada previamente

El objetivo de lo que quiero es dirigir al usuario a una nueva pantalla con un clic dependiendo de lo que muestra la imagen.

Para simplificar, supongamos que hay dos posibilidades: una imagen negra y una verde. Al hacer clic en la imagen negra, accederá a xib1 y al hacer clic en la imagen verde, accederá a xib2.

Esto es bastante simple y ha estado funcionando hasta que haya implementado un sistema de guardar y cargar.

Para guardar hago lo siguiente:

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

y cargar hago lo siguiente:

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

Esto está bien y cuando sale del programa y reiniciarlo la imagen se conserva en la pantalla como deseo que sea. Hipotéticamente, digamos que la imagen que ahora aparece en el botón 1 es la imagen verde.

Cuando llamo el código siguiente después de hacer clic en el botón con id de los emisores (este es el botón 1):

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

aunque el currentImage es la imagen verde y es la misma imagen que la imagen I verde estoy comparando con, creo, porque he salvado la imagen verde en la memoria en el proceso de memoria, la comparación no funciona, ya que se llevan a cabo en diferentes lugares de la memoria - verificado por la siguiente NSLog:

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

I No se puede averiguar cómo comparar las dos imágenes por lo que en este caso coinciden (ambos se relacionan con la misma imagen que tengo en la carpeta de recursos). ¿Alguien tiene alguna sugerencia?

Háganme saber si no he explicado suficientemente cuál es el problema.

¡Gracias de antemano!

+0

Si no necesita una comparación de 100% píxel por píxel, puede usar esto, que es aproximadamente 50 veces más rápido que la solución de Paul N: http://stackoverflow.com/a/19668235/423171 – cprcrack

+0

Podría vale la pena considerar extender UIImage para agregar algunos campos de identificación y comparar métodos. (No estoy seguro de cuán feliz se va a extender UIImage.) –

Respuesta

25

Puede comparar el nombre de la imagen o la URL de la imagen si se descargó de Internet, también será más rápido que comparar las imágenes.

Además, el problema es que al usar el operador == está comparando las direcciones de memoria de las imágenes 0x95614c0 y 0xde748f0. Es por eso que no es igual. Está comparando si son el mismo objeto, no si las imágenes son iguales.

Para comparar el uso de las imágenes: Como se menciona en la respuesta de Fls'Zen.

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

Hola Paul, gracias por tu respuesta. He usado etiquetas para identificar entre diferentes botones que sostienen mis imágenes y esto funciona bien, pero ¿puedes incluso etiquetar una imagen? Además, el código que proporcionaste, que ya había probado en mi código, no sirvió para nada; todavía no reconozco que son iguales. – user1309044

+0

Tienes razón, no puedo Supongo que me confundí con ImageView, también confirmé que el método isEqual no funciona para las imágenes, ya que también compara el puntero del objeto, me disculpo por apuntarle en una dirección incorrecta , Actualicé mi respuesta con el único método que encontré para comparar las imágenes. –

+0

No se preocupe, Paul - ¡estoy agradecido por la respuesta en primer lugar! – user1309044

4

Sus imágenes ciertamente tienen direcciones diferentes ya que una se carga desde su paquete de aplicaciones y una se carga desde el directorio de documentos. La función [UIImage imageNamed:] solo devuelve imágenes del paquete de aplicaciones.

Si realmente desea comparar las imágenes por contenido, consulte this SO pregunta. En la primera respuesta, se calcula un valor hash para una imagen. En tu código, puedes comparar los valores hash de las dos imágenes que tienes.La segunda respuesta compara las imágenes directamente, en caso de que los hashes te pongan nervioso.

Recomiendo ir por una ruta diferente y que su aplicación rastree qué imagen se carga fuera de la imagen.

+1

Hola Fls'Zen, gracias por tu respuesta. Eché un vistazo al enlace que mencionaste y, aunque el primer método parecía bastante extravagante para una tarea bastante trivial (que tendría que repetir muchas otras veces), intenté con el segundo método que me indicaste que, lamentablemente, no funcionó cualquiera (no coinciden). Podría simplemente crear una matriz bool o binaria que se actualiza cada vez que la imagen cambia y basar mi acción en el valor de esa variable. Mantendré abierta la pregunta en caso de que alguien tenga más respuestas. Gracias por la respuesta, es muy apreciada. – user1309044

Cuestiones relacionadas