Partager via


Comment : faire pivoter des couleurs

La rotation dans un espace de couleurs à quatre dimensions est difficile à visualiser. Pour faciliter la visualisation, choisissez de ne pas modifier l'une des composantes de couleur. Supposez que la composante alpha soit fixée à 1 (totalement opaque). Vous pouvez ensuite visualiser un espace de couleurs à trois dimensions ayant des axes rouges, verts et bleus, comme montré dans l'illustration suivante.

Recoloriage

Une couleur peut être représentée sous la forme d'un point dans un espace en trois dimensions. Par exemple, le point (1, 0, 0) dans l'espace représente la couleur rouge et le point (0, 1, 0) la couleur verte.

L'illustration suivante montre la rotation de la couleur (1, 0, 0) via un angle de 60 degrés du plan Rouge-Vert. La rotation d'un plan parallèle en plan Rouge-Vert peut être représentée comme une rotation sur l'axe bleu.

Recoloriage

L'illustration suivante montre la façon d'initialiser une matrice de couleurs pour effectuer des rotations sur chacun des trois axes de coordonnées (rouge, vert, bleu).

Recoloriage

Exemple

L'exemple suivant prend une image d'une seule couleur (1, 0, 0.6) et applique une rotation de 60 degrés sur l'axe bleu. L'angle de rotation est balayé pour passer d'un plan parallèle au plan rouge-vert.

L'illustration suivante montre l'image d'origine sur la gauche et l'image dont les couleurs ont subi une rotation sur la droite.

Rotation des couleurs

L'illustration suivante montre une visualisation de la rotation de couleurs effectuée dans le code ci-après.

Recoloriage

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

}

Compilation du code

L'exemple précédent est destiné à une utilisation avec Windows Forms et nécessite PaintEventArgs e, qui est un paramètre du gestionnaire d'événements Paint. Remplacez RotationInput.bmp par le nom et le chemin d'accès d'un fichier image valides sur votre système.

Voir aussi

Référence

ColorMatrix

ImageAttributes

Autres ressources

Graphiques et dessins dans les Windows Forms

Recoloriage des images