Share via


Rotazione dei colori

La rotazione in uno spazio di colore tridimensionale è difficile da visualizzare. È possibile semplificare la visualizzazione della rotazione accettando di mantenere fisso uno dei componenti di colore. Si supponga di accettare di mantenere fisso il componente alfa a 1 (completamente opaco). È quindi possibile visualizzare uno spazio dei colori tridimensionale con assi rosso, verde e blu, come illustrato nella figura seguente.

illustrazione di una vista prospettica di uno spazio colore tridimensionale con assi con etichette rosso, verde e blu

Un colore può essere considerato come un punto nello spazio 3D. Ad esempio, il punto (1, 0, 0) nello spazio rappresenta il colore rosso e il punto (0, 1, 0) nello spazio rappresenta il colore verde.

La figura seguente mostra cosa significa ruotare il colore (1, 0, 0) attraverso un angolo di 60 gradi nel piano Red-Green. La rotazione in un piano parallelo al piano Red-Green può essere considerata come rotazione sull'asse blu.

illustrazione che mostra il punto (1, 0, 0) ruotato da 60 gradi a (0,5, 0,866, 0)

La figura seguente illustra come inizializzare una matrice di colori per eseguire rotazioni su ognuno dei tre assi delle coordinate (rosso, verde, blu).

illustrazione che mostra le matrici di colori che eseguono rotazioni su ognuno dei tre assi delle coordinate

L'esempio seguente accetta un'immagine che corrisponde a un colore (1, 0, 0,6) e applica una rotazione di 60 gradi sull'asse blu. L'angolo della rotazione viene spazzato via in un piano parallelo al piano Red-Green.

Image            image(L"RotationInput.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();
REAL             degrees = 60;
REAL             pi = acos(-1);  // the angle whose cosine is -1.
REAL             r = degrees * pi / 180;  // degrees to radians

ColorMatrix colorMatrix = {
   cos(r),  sin(r), 0.0f, 0.0f, 0.0f,
   -sin(r), cos(r), 0.0f, 0.0f, 0.0f,
   0.0f,    0.0f,   1.0f, 0.0f, 0.0f,
   0.0f,    0.0f,   0.0f, 1.0f, 0.0f,
   0.0f,    0.0f,   0.0f, 0.0f, 1.0f};
   
imageAttributes.SetColorMatrix(
   &colorMatrix, 
   ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
   
graphics.DrawImage(&image, 10, 10, width, height);

graphics.DrawImage(
   &image, 
   Rect(130, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel,
   &imageAttributes);

La figura seguente mostra l'immagine originale a sinistra e l'immagine ruotata a colori a destra.

illustrazione che mostra rettangoli riempiti con l'immagine originale (rosso viola) e l'immagine ruotata a colori (verde mare)

La rotazione dei colori eseguita nell'esempio di codice precedente può essere visualizzata come indicato di seguito.

illustrazione che mostra uno spazio colore 3d e il punto (1, 0, 0,6) ruotato da 60 gradi a (0,5, 0,866, 0,6)