Condividi tramite


Rotazione di colori

È difficile visualizzare la rotazione in uno spazio cromatico quadridimensionale. È possibile semplificare la visualizzazione di tale rotazione supponendo di mantenere fissa una delle componenti di colore. Si supponga di mantenere fissa a 1 la componente alfa, che è completamente opaca. Sarà quindi possibile visualizzare uno spazio cromatico tridimensionale con assi del rosso, del verde e del blu, come mostrato nell'illustrazione che segue.

È possibile considerare un colore come un punto nello spazio tridimensionale. Il punto (1, 0, 0) dello spazio, ad esempio, rappresenta il colore rosso, il punto (0, 1, 0) il colore verde.

Nell'illustrazione che segue si mostra cosa significhi ruotare il colore (1, 0, 0) di un angolo di 60 gradi sul piano rosso-verde. La rotazione su un piano parallelo al piano rosso-verde può essere vista come una rotazione rispetto all'asse del blu.

Nell'illustrazione che segue si mostra come inizializzare una matrice di colori per eseguire rotazioni rispetto a ciascuno dei tre assi delle coordinate rosso, verde e blu.

Nell'esempio che segue viene applicata una rotazione a 60 gradi sull'asse del blu a un'immagine monocromatica (1, 0, 0,6). La rotazione viene effettuata su un piano parallelo al piano rosso-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);

Nell'illustrazione che segue si mostra l'immagine originale a sinistra e l'immagine dopo la rotazione di colori a destra.

Nell'illustrazione che segue si mostra una visualizzazione della rotazione dei colori eseguita nel codice precedente.