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.
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.
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).
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.
L'illustration suivante montre une visualisation de la rotation de couleurs effectuée dans le code ci-après.
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.