Compartir a través de


Cómo: Rotar colores

La rotación en un espacio de color cuatridimensional es difícil de visualizar. Para poder ver la rotación fácilmente, se ha decidido mantener uno de los componentes de color fijo. Supongamos que se decide fijar el componente alfa en 1 (completamente opaco). Entonces se podrá ver un espacio de color tridimensional con los ejes rojo, verde y azul como se muestra en la siguiente ilustración.

Cambio de color

Los colores se pueden considerar como puntos en un espacio tridimensional. Por ejemplo, el punto (1, 0, 0) en un espacio representa el color rojo, mientras que el punto (0, 1, 0) en un espacio representa el color verde.

En la siguiente ilustración se muestra el resultado al rotar el color (1, 0, 0) en un ángulo de 60 grados en el plano Rojo-Verde. La rotación en un plano paralelo al plano Rojo-Verde puede considerarse como una rotación sobre el eje azul.

Cambio de color

En la siguiente ilustración se muestra cómo inicializar una matriz de color para realizar rotaciones sobre cada uno de los tres ejes de coordenadas (rojo, verde, azul).

Cambio de color

Ejemplo

En el siguiente ejemplo se toma una imagen de un solo color (1, 0, 0,6) y se aplica una rotación de 60 grados sobre el eje azul. El ángulo de rotación se trazará en un plano paralelo al plano rojo-verde.

En la siguiente ilustración se muestra la imagen original a la izquierda y la imagen con rotación de colores a la derecha.

Rotar colores

En la siguiente ilustración se muestra una visualización de la rotación de color realizada en el siguiente código.

Cambio de color

Private Sub RotateColors(ByVal e As PaintEventArgs)
    Dim image As Bitmap = New Bitmap("RotationInput.bmp")
    Dim imageAttributes As New ImageAttributes()
    Dim width As Integer = image.Width
    Dim height As Integer = image.Height
    Dim degrees As Single = 60.0F
    Dim r As Double = degrees * System.Math.PI / 180 ' degrees to radians
    Dim colorMatrixElements As Single()() = { _
       New Single() {CSng(System.Math.Cos(r)), _
                     CSng(System.Math.Sin(r)), 0, 0, 0}, _
       New Single() {CSng(-System.Math.Sin(r)), _
                     CSng(-System.Math.Cos(r)), 0, 0, 0}, _
       New Single() {0, 0, 2, 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)

    ' Pass in the destination rectangle (2nd argument), the upper-left corner 
    ' (3rd and 4th arguments), width (5th argument),  and height (6th 
    ' argument) of the source rectangle.
    e.Graphics.DrawImage( _
       image, _
       New Rectangle(150, 10, width, height), _
       0, 0, _
       width, _
       height, _
       GraphicsUnit.Pixel, _
       imageAttributes)
End Sub
private void RotateColors(PaintEventArgs e)
{
    Bitmap image = new Bitmap("RotationInput.bmp");
    ImageAttributes imageAttributes = new ImageAttributes();
    int width = image.Width;
    int height = image.Height;
    float degrees = 60f;
    double r = degrees * System.Math.PI / 180; // degrees to radians

    float[][] colorMatrixElements = { 
        new float[] {(float)System.Math.Cos(r),  (float)System.Math.Sin(r),  0,  0, 0},
        new float[] {(float)-System.Math.Sin(r),  (float)-System.Math.Cos(r),  0,  0, 0},
        new float[] {0,  0,  2,  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);

}

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 del evento Paint. Reemplace RotationInput.bmp por un nombre de archivo de imagen y una ruta de acceso válidos en el sistema.

Vea también

Referencia

ColorMatrix

ImageAttributes

Otros recursos

Gráficos y dibujos en Windows Forms

Cambiar el color de las imágenes