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 |
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.
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!
ResponderEliminarSaludos!