Procedura: ruotare i colori

Aggiornamento: novembre 2007

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

Ricolorazione

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

Ricolorazione

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.

Ricolorazione

Esempio

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.

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

Rotazione dei colori

Nell'illustrazione che segue viene mostrata una visualizzazione della rotazione dei colori eseguita nel codice riportato di seguito.

Ricolorazione

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

}

Compilazione del codice

L'esempio riportato in precedenza è stato creato per essere utilizzato con Windows Form e richiede PaintEventArgse, un parametro del gestore eventi Paint. Sostituire RotationInput.bmp con il nome e il percorso di un file di immagine validi nel computer in uso.

Vedere anche

Riferimenti

ColorMatrix

ImageAttributes

Altre risorse

Grafica e disegno in Windows Form

Ricolorazione di immagini