Compartir a través de


Utilizar una matriz de color para transformar un color único

GDI+ proporciona las clases Image y Bitmap para guardar y manipular imágenes. Los objetos Image y Bitmap guardan el color de cada píxel como un número de 32 bits: 8 bits cada uno para 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. Si se utiliza esta convención, el color descrito en el párrafo anterior estaría representado por el vector (0, 1, 0, 1). GDI+ utiliza la convención de 1 para representar la intensidad total cuando realiza 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 4×4. Sin embargo, no se puede utilizar una matriz 4×4 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 5×5 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.

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 5×5 (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.

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

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.

Dim image = 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)
[C#]
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);

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

El código del ejemplo anterior 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. Paso el objeto ImageAttributes al método DrawImage de un objeto Graphics.