Quantcast
Channel: Comparar dos imagenes
Viewing all articles
Browse latest Browse all 9

Comparar dos imagenes

$
0
0

"e_clarin" preguntó:

> ¿Como puedo saber si las dos imágenes son exactamente iguales?

Hola:

Observando el contenido del enlace que te ha indicado el usuario Antonio Lobo, pienso que tampoco es sumamente necesario crear un nuevo objeto "Bitmap temporal" para pintarle sus píxeles con colores blanco y rojo. Creo que esa operación es innecesaria para tus propósitos, porque el recorrer los píxeles de las dos imágenes, es una operación que puede llevar su tiempo. Todo dependerá del tamaño que tengan las imágenes existentes en los controles PictureBox; a mayor tamaño, más tardará el código en ejecutarse.

Eliminando lo que a mi entender sobra del mencionado código, quizás te sirva la siguiente función:

    ''' <summary>
    ''' Indica si dos objetos Bitmap son iguales, en tamaño y en píxeles.
    ''' </summary>
    ''' <param name="img1">Primer objeto Bitmap que se desea comparar.</param>
    ''' <param name="img2">Segundo objeto Bitmap que se desea comparar.</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CompareBitmaps(img1 As Bitmap, img2 As Bitmap) As Boolean

        If ((img1 Is Nothing) OrElse _
            (img2 Is Nothing)) Then Return False

        ' Comprobar si el tamaño de las imágenes son iguales.
        '
        Dim equal As Boolean = img1.Size.Equals(img2.Size)

        If (Not equal) Then Return False

        ' Los tamaños de las dos imágenes son iguales.
        '
        ' Recorrer los píxeles para verificar que
        ' sus colores son iguales en ambas imágenes.
        '
        For x As Integer = 0 To img1.Width - 1

            For y As Integer = 0 To img1.Height - 1

                Dim color1 As Color = img1.GetPixel(x, y)
                Dim color2 As Color = img2.GetPixel(x, y)

                If (Not color1.Equals(color2)) Then
                    equal = False
                    Exit For
                End If

            Next

            If (Not equal) Then Exit For

        Next

        Return equal

    End Function

Como podrás observar, primero se comprueba si el tamaño de las dos imágenes son iguales. Si el tamaño no es el mismo, con abandonar la función es más que suficiente, porque se comprende que las imágenes ya no son iguales.

Una vez que sepamos que el tamaño es idéntico, entonces comprobamos si coinciden los colores de los píxeles, pero si hay alguno que no coincide, abandonamos el bucle y la función devolverá el valor False, porque si ya hay un píxel que no coincide, ¿para qué queremos seguir con la ejecución de los dos bucles For? Desde luego, repito que para mí no tiene ningún sentido.

Cuando desees comparar las dos imágenes existentes en tus controles PictureBox, llamarías a la función de la siguiente manera:

Try
    Dim bmp1 As Bitmap = DirectCast(PictureBox1.Image, Bitmap)
    Dim bmp2 As Bitmap = DirectCast(PictureBox2.Image, Bitmap)

    Dim bln As Boolean = CompareBitmaps(bmp1, bmp2)

    If (bln) Then
        MessageBox.Show("Las imágenes SON iguales.")

    Else
        MessageBox.Show("Las imágenes NO SON iguales.")

    End If

Catch ex As Exception
    ' Se ha producido un error
    MessageBox.Show(ex.Message)

End Try

En fin, tampoco vas a perder nada por probar la función CompareBitmaps. :-)

Un saludo


Enrique Martínez
  [MS MVP - VB]

Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.






Viewing all articles
Browse latest Browse all 9

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>