Seguimos con algunos efectos en imágenes. El siguiente que realizaremos es aplicar una sombra a una imagen. Para ello, partimos de que ya se conoce un poco cómo se aplican los efectos en imágenes. El proceso es sencillo, primeramente se almacenan los valores de la imagen original y luego éstos se modifican.
Creamos un nuevo proyecto con un Picturebox al que le asignamos una imagen.
Hacemos doble clic sobre el botón y asignamos el siguiente código:
'Leemos los valores de la imagen original y rotada
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
Dim bmpRotado As Bitmap = bmp.Clone(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.PixelFormat.DontCare) 'Clonamos el bitmap original (bmp)
Dim NivelesRota(,) As System.Drawing.Color 'Almacenará los niveles digitales de la imagen
bmpRotado.RotateFlip(RotateFlipType.RotateNoneFlipY) 'Rotamos el Bitmap
'Este primer bloque, guarda los niveles digitales de la imagen en la variable Niveles y NivelesRota
Dim i, j As Long
ReDim Niveles(bmp.Width - 1, bmp.Height - 1) 'Asignamos a la matriz las dimensiones de la imagen -1 *
ReDim NivelesRota(bmpRotado.Width - 1, bmpRotado.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.
NivelesRota(i, j) = bmpRotado.GetPixel(i, j) 'Con el método GetPixel, asignamos para cada celda de la matriz el color con sus valores RGB. de la imagen rotada
Next
Next
'Una vez guardada la información de cada píxel (de la imagen origina)
'Aplicamos el efecto sombra
Dim Rojo, Verde, Azul, alfa As Byte 'Declaramos tres variables que almacenarán los colores
Dim alfaaxu As Double
Dim contadorAlfa As Double = 0
Dim cuentaAux As Double = 255 / (bmp.Height / 3) 'El tamaño de la sombra será 1/3 del original
Dim bmp3 As New Bitmap(bmp.Width, CInt(bmp.Height + (bmp.Height / 3))) 'Creamos un bitmap con la altura del bmp original más la parte de la sombra
For j = 0 To bmp3.Height - 1
If j > Niveles.GetUpperBound(1) Then
contadorAlfa += cuentaAux 'Restamos una "unidad" al canal alfa para ir atenuando la sombra
End If
For i = 0 To bmp3.Width - 1 'Recorremos la matriz
If j < Niveles.GetUpperBound(1) Then 'Si es menor que el alto de la imagen original
Rojo = Niveles(i, j).R
Verde = Niveles(i, j).G
Azul = Niveles(i, j).B
alfa = Niveles(i, j).A
bmp3.SetPixel(i, j, Color.FromArgb(alfa, Rojo, Verde, Azul)) 'Asignamos a bmp los colores
Else
Rojo = NivelesRota(i, j - Niveles.GetUpperBound(1)).R
Verde = NivelesRota(i, j - Niveles.GetUpperBound(1)).G
Azul = NivelesRota(i, j - Niveles.GetUpperBound(1)).B
alfaaxu = NivelesRota(i, j - Niveles.GetUpperBound(1)).A - contadorAlfa
If alfaaxu < 0 Then
alfaaxu = 0 'Para evitar que el último píxel sea menor de 0
End If
alfa = alfaaxu
bmp3.SetPixel(i, j, Color.FromArgb(alfa, Rojo, Verde, Azul)) 'Asignamos a bmp los colores
End If
Next
Next
PictureBox1.Image = bmp3
En resumen, lo que hacemos es rotar la imagen original y leer los valores tanto de la imagen original como la rotada. A continuación, creamos un bitmap (bmp3) con el ancho de la imagen original y el alto de la imagen original más la parte que rotamos (un tercio en este caso). Para crear la imagen con la sombra, vamos asignando al bitmap que hemos creado (bmp3) todo el bitmap original y luego la parte (un tercio) de la imagen rotada disminuyendo el canal alfa para que se vaya atenuando.
La imagen resultante será la siguiente:
Más info: http://ocw.usal.es/ensenanzas-tecnicas/herramientas-informaticas-para-el-geoprocesado
excelente trabajo amigos ..sigan asi :D
ResponderEliminarExcelente trabajo amigos. Muy buenas soluciones.
ResponderEliminar