Compartir a través de


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.

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.

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).

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.

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

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

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