Compartir a través de


Cómo: Utilizar una matriz de color para transformar un color único

GDI+ proporciona las clases Image y Bitmap para almacenar y manipular imágenes. Los objetos Image y Bitmap almacenan el color de cada píxel como un número de 32 bits: 8 bits para cada color, rojo, verde, azul y alfa. Cada uno de los cuatro componentes es un número del 0 al 255, indicando 0 ninguna intensidad y 255, intensidad total. El componente alfa especifica la transparencia del color: 0 es totalmente transparente, y 255 es completamente opaco.

Los vectores de color constan de cuatro cifras (rojo, verde, azul y alfa). Por ejemplo, el vector de color (0, 255, 0, 255) representa un color opaco que no tiene nada de rojo o azul, pero sí tiene verde con intensidad total.

Otra convención para representar los colores emplea el número 1 para la intensidad total. Con esa convención, el vector (0, 1, 0, 1) representaría el color descrito en el párrafo anterior. GDI+ utiliza la convención 1 como intensidad total cuando realiza las transformaciones de color.

Se pueden aplicar transformaciones lineales (rotación, ajuste y similares) a los vectores de color multiplicando los vectores de color por una matriz 4x4. Sin embargo, no se puede utilizar una matriz 4x4 para realizar una conversión (alineal). Si se agrega una quinta coordenada ficticia (por ejemplo, el número 1) a cada vector de color, se podrá utilizar una matriz 5x5 para aplicar cualquier combinación de conversiones y transformaciones lineales. Las transformaciones que consisten en una transformación lineal seguida de una conversión se denominan transformaciones afines.

Por ejemplo, supongamos que se va a empezar con el color (0.2, 0.0, 0.4, 1.0) y se van a aplicar las siguientes transformaciones:

  1. Duplique el componente rojo.

  2. Agregue 0.2 a los componentes rojo, verde y azul.

La siguiente multiplicación de matrices realizará el par de transformaciones en el orden indicado.

Cambio de color

Los elementos de una matriz de color se indizan (basados en creo) por filas y luego por columnas. Por ejemplo, M[4][2] indica la entrada de la quinta fila y la tercera columna de la matriz M.

La matriz de identidad 5x5 (que aparece en la siguiente ilustración) tiene unos (1) en la diagonal y ceros (0) en el resto. Si se multiplica un vector de color por la matriz de identidad, el vector de color no cambia. Una forma práctica de formar la matriz de una transformación de colores es comenzar por la matriz de identidad y realizar un ligero cambio que produzca la transformación deseada.

Cambio de color

Para obtener una descripción más detallada de las matrices y las transformaciones, vea Sistemas de coordenadas y transformaciones.

Ejemplo

En el siguiente ejemplo se toma una imagen de un solo color (0.2, 0.0, 0.4, 1.0) y se aplica la transformación descrita en los párrafos anteriores.

En la siguiente ilustración se muestra la imagen original a la izquierda y la imagen transformada a la derecha.

Colores

El código del ejemplo siguiente utiliza los siguientes pasos para cambiar el color:

  1. Inicialice un objeto ColorMatrix.

  2. Cree un objeto ImageAttributes y pase el objeto ColorMatrix al método SetColorMatrix del objeto ImageAttributes.

  3. Pase el objeto ImageAttributes al método DrawImage de un objeto Graphics.

        Dim image As New Bitmap("InputColor.bmp")
        Dim imageAttributes As New ImageAttributes()
        Dim width As Integer = image.Width
        Dim height As Integer = image.Height

        ' The following matrix consists of the following transformations:
        ' red scaling factor of 2
        ' green scaling factor of 1
        ' blue scaling factor of 1
        ' alpha scaling factor of 1
        ' three translations of 0.2
        Dim colorMatrixElements As Single()() = { _
           New Single() {2, 0, 0, 0, 0}, _
           New Single() {0, 1, 0, 0, 0}, _
           New Single() {0, 0, 1, 0, 0}, _
           New Single() {0, 0, 0, 1, 0}, _
           New Single() {0.2F, 0.2F, 0.2F, 0, 1}}

        Dim colorMatrix As New ColorMatrix(colorMatrixElements)

        imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)

        e.Graphics.DrawImage(image, 10, 10)

        e.Graphics.DrawImage( _
           image, _
           New Rectangle(120, 10, width, height), _
           0, _
           0, _
           width, _
           height, _
           GraphicsUnit.Pixel, _
           imageAttributes)

Image image = new Bitmap("InputColor.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = { 
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10);

e.Graphics.DrawImage(
   image,
   new Rectangle(120, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   GraphicsUnit.Pixel,
   imageAttributes);

Compilar el código

El ejemplo anterior está diseñado para formularios Windows Forms y requiere PaintEventArgs e, que es un parámetro del controlador de eventos Paint.

Vea también

Otros recursos

Cambiar el color de las imágenes

Sistemas de coordenadas y transformaciones