none
¿Se puede comparar imágenes? RRS feed

  • Pregunta

  • Me parece que sí porque son serializables. Por ejemplo si tengo dos botones y digo:

    .

    Boton1.Image=My.Resources.Imagen1

    Boton2.Image=My.Resources.Imagen2

    .

    ¿Cómo puedo comparar la propiedad Image de los botones para saber si contienen la misma imagen?




    • Editado James2016-2 miércoles, 22 de mayo de 2019 21:49
    miércoles, 22 de mayo de 2019 21:47

Respuestas

  • Es más complicado de lo que parece. Si comparas la propiedad Image, dado que es un tipo-referencia y no tiene un override del Equals el sistema delegará en ReferenceEquals y comparará las referencias, en lugar del contenido al que apuntan las referencias. En otras palabras, solo te dirá si las dos imágenes son exactamente la misma (almacenada en la misma posición en memoria). En el ejemplo que has puesto, eso sería "false" porque apuntan a dos recursos distintos.

    Si quieres comprobar si los bytes de las imágenes son iguales, puedes usar el método "Save" del Image para trasvasarlas a un MemoryStream. Después de salvar las dos, recorres con un bucle los dos MemoryStreams y vas comparando uno por uno todos los bytes a ver si son idénticos.

    Pero ten presente que eso dirá que son distintas en el momento en que discrepe un solo pixel. Puede que dos imágenes aparenten ser exactamente iguales a simple vista pero que tengan alguna minúscula diferencia en la forma en la que se salvaron, y con este procedimiento te saldría que son diferentes.

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 23 de mayo de 2019 14:25
    • Marcado como respuesta James2016-2 jueves, 23 de mayo de 2019 17:48
    jueves, 23 de mayo de 2019 6:40

Todas las respuestas

  • Es más complicado de lo que parece. Si comparas la propiedad Image, dado que es un tipo-referencia y no tiene un override del Equals el sistema delegará en ReferenceEquals y comparará las referencias, en lugar del contenido al que apuntan las referencias. En otras palabras, solo te dirá si las dos imágenes son exactamente la misma (almacenada en la misma posición en memoria). En el ejemplo que has puesto, eso sería "false" porque apuntan a dos recursos distintos.

    Si quieres comprobar si los bytes de las imágenes son iguales, puedes usar el método "Save" del Image para trasvasarlas a un MemoryStream. Después de salvar las dos, recorres con un bucle los dos MemoryStreams y vas comparando uno por uno todos los bytes a ver si son idénticos.

    Pero ten presente que eso dirá que son distintas en el momento en que discrepe un solo pixel. Puede que dos imágenes aparenten ser exactamente iguales a simple vista pero que tengan alguna minúscula diferencia en la forma en la que se salvaron, y con este procedimiento te saldría que son diferentes.

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 23 de mayo de 2019 14:25
    • Marcado como respuesta James2016-2 jueves, 23 de mayo de 2019 17:48
    jueves, 23 de mayo de 2019 6:40
  • mm ya veo que no es buena idea hacerlo así; lo que quería era alternar un par de imágenes y que cuando una de ellas sea igual a otra que tengo de referencia entonces que la intercambie, pero creo que se puede hacer fácilmente con una variable tipo "flag" para indicar un estado y según eso intercambiarlas, queda descartado entonces comparar las imágenes, no vale la pena en este caso. Gracias por la explicación.
    jueves, 23 de mayo de 2019 17:48