Procedimiento para sesgar colores

El sesgo aumenta o disminuye un componente de color en una cantidad proporcional a otro componente de color. Por ejemplo, considere la transformación en la que el componente rojo aumenta en un 50 % el valor del componente azul. Con esta transformación, el color (0.2, 0.5, 1) se convertiría en (0.7, 0.5, 1). El nuevo componente rojo es 0.2 + (1/2)(1) = 0.7.

Ejemplo

En el ejemplo siguiente se construye un objeto Image a partir del archivo ColorBars4.bmp. A continuación, el código aplica la transformación de sesgo descrita en el párrafo anterior a cada píxel de la imagen.

En la ilustración siguiente se muestra la imagen original a la izquierda y la imagen sesgada a la derecha:

Dos cuadrados con franjas coloreados en paralelo que ilustran la imagen original y la imagen sesgada.

En la tabla siguiente se enumeran los vectores de color de las cuatro barras antes y después de la transformación de sesgo.

Original Sesgado
(0, 0, 1, 1) (0.5, 0, 1, 1)
(0.5, 1, 0.5, 1) (0.75, 1, 0.5, 1)
(1, 1, 0, 1) (1, 1, 0, 1)
(0.4, 0.4, 0.4, 1) (0.6, 0.4, 0.4, 1)
Image image = new Bitmap("ColorBars.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
        new float[] {1,  0,  0,  0, 0},
        new float[] {0,  1,  0,  0, 0},
        new float[] {0.5f,  0,  1,  0, 0},
        new float[] {0,  0,  0,  1, 0},
        new float[] {0, 0, 0, 0, 1}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

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

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

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 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);
Dim image = New Bitmap("ColorBars.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = _
    {New Single() {1, 0, 0, 0, 0}, _
        New Single() {0, 1, 0, 0, 0}, _
        New Single() {0.5F, 0, 1, 0, 0}, _
        New Single() {0, 0, 0, 1, 0}, _
        New Single() {0, 0, 0, 0, 1}}

Dim colorMatrix As New ColorMatrix(colorMatrixElements)

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

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

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

Compilar el código

El ejemplo anterior está diseñado para su uso con Windows Forms y requiere PaintEventArgse, que es un parámetro del controlador de eventos Paint. Reemplace ColorBars.bmp por un nombre de imagen y una ruta de acceso válidos en el sistema.

Consulte también