jueves, 13 de diciembre de 2012

Tratamiento de imágenes (Parte VII). Efecto sombra

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:


Puedes descargar el ejemplo completo aquí.


Más info: http://ocw.usal.es/ensenanzas-tecnicas/herramientas-informaticas-para-el-geoprocesado

2 comentarios: