jueves, 13 de diciembre de 2012

Tratamiento de imágenes (Parte VI). Distorsión de imagen

Vamos a retomar un poco el tratamiento de imágenes digitales. En esta ocasión vamos a aplicar una distorsión a la imagen con el fin de crear un efecto similar al mostrado a continuación.

Imagen original

Imagen distorsionada
Primeramente vamos a partir de que sabemos abrir una imagen en un Picturebox (revisa las anteriores entradas (I, II, III, IV, V), o descarga el código fuente). Si no sabes, no te preocupes. Crea un nuevo proyecto y a un PictureBox asignale una imagen.


Hacemos doble clic sobre la opción distorsión y vamos a escribir el siguiente código:
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim bmp As New Bitmap(PictureBox1.Image) 'Creamos un bitmap con la imagen del Picturebox
        Dim Niveles(,) As System.Drawing.Color 'Almacenará los niveles digitales de la imagen
        'Este primer bloque, guarda los niveles digitales de la imagen en la variable Niveles
        Dim i, j As Long
        ReDim Niveles(bmp.Width - 1, bmp.Height - 1)  'Asignamos a la matriz las dimensiones de la imagen -1 *
        For i = 0 To bmp.Width - 1 'Recorremos la matriz a lo ancho
            For j = 0 To bmp.Height - 1 'Recorremos la matriz a lo largo
                Niveles(i, j) = bmp.GetPixel(i, j) 'Con el método GetPixel, asignamos para cada celda de la matriz el color con sus valores RGB.
            Next
        Next
        'Una vez guardada la información de cada píxel (de la imagen origina)
        'Aplicamos el efecto distorsión
        Dim Rojo, Verde, Azul, alfa As Byte 'Declaramos cuatro variables que almacenarán los colores

        Dim random As New Random 'Instancia para crear un número al azar
        Dim numeroRandom As Integer 'Esta variable almacena un número al azar

        For i = 0 To Niveles.GetUpperBound(0)  'Recorremos la matriz
            For j = 0 To Niveles.GetUpperBound(1) 'Recorremos la matriz
                numeroRandom = random.Next(5) 'Generamos un valor al azar entre 0 y 4
                'Excluimos los valores extremos del margen derecho en inferior
                If j < Niveles.GetUpperBound(1) - 4 And i < Niveles.GetUpperBound(0) - 4 Then
                    Rojo = Niveles(i + numeroRandom, j + numeroRandom).R
                    Verde = Niveles(i + numeroRandom, j + numeroRandom).G
                    Azul = Niveles(i + numeroRandom, j + numeroRandom).B
                    alfa = Niveles(i + numeroRandom, j + numeroRandom).A
                Else
                    Rojo = Niveles(i, j).R
                    Verde = Niveles(i, j).G
                    Azul = Niveles(i, j).B
                    alfa = Niveles(i, j).A
                End If
                bmp.SetPixel(i, j, Color.FromArgb(alfa, Rojo, Verde, Azul)) 'ASignamos el valor
            Next
        Next
        PictureBox1.Image = bmp 'ASignamos el Bitmap modificado al Picturebox
    End Sub

Como podemos observar, lo que realmente hacemos es mover cada píxel de su posición original. Para realizar esto, con la función Random generamos un valor entre 0 y 3, y ese valor será lo que moveremos el píxel de su posición original. El problema reside, por ejemplo, que si estamos en el último píxel de la parte derecha y le sumamos un valor en la posición horizontal se mostrará un error. Para solucionarlo en los extremos derecho e inferior asignamos directamente la posición original del píxel. Quizá no sea la mejor solución pero así queda el código más claro.
Adicionalmente, se podría incluir un Hscrollbar para seleccionar el nivel de distorsión. Esto se ha incluido en el código fuente que puedes descargar a continuación.



1 comentario:

  1. Por favor no te canses nunca, lo que haces es muy impresionante, he portado el código a c# y va genial... Muchas gracias por compartir el material!

    Saludos!

    ResponderEliminar