Partager via


Utilisation de transformations pour mettre à l'échelle des couleurs

Mise à jour : novembre 2007

Une transformation par ajustement multiplie une ou plusieurs des quatre composantes de couleur par un nombre. Les entrées de la matrice de couleurs représentant l'ajustement sont présentées dans le tableau suivant.

Composante à ajuster

Entrée de la matrice

Red

[0][0]

Green

[1][1]

Blue

[2][2]

Alpha

[3][3]

Mise à l'échelle d'une couleur

L'exemple suivant construit un objet Image à partir du fichier ColorBars2.bmp. Ensuite, le code ajuste la composante bleu de chaque pixel de l'image par un facteur de 2. L'image d'origine est dessinée le long de l'image transformée.

Dim image As New Bitmap("ColorBars2.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = { _
   New Single() {1, 0, 0, 0, 0}, _
   New Single() {0, 1, 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)

Image image = new Bitmap("ColorBars2.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = { 
   new float[] {1,  0,  0,  0, 0},
   new float[] {0,  1,  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);

L'illustration suivante montre l'image d'origine sur la gauche et l'image ajustée sur la droite.

Mise à l'échelle des couleurs

Le tableau suivant dresse la liste des vecteurs de couleurs pour les quatre barres situées de part et d'autre de l'ajustement du bleu. Notez que la composante bleu située sur la quatrième barre de couleurs est passée de 0,8 à 0,6. Cela est dû au fait que GDI+ conserve uniquement la partie fractionnaire du résultat. Par exemple, (2)(0,8) = 1,6 et la partie fractionnaire de 1,6 est 0,6. Conserver uniquement la partie fractionnaire garantit que le résultat se trouve toujours dans l'intervalle [0, 1].

D'origine

Ajustée

(0.4, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.2, 0.2, 1)

(0.4, 0.2, 0.4, 1)

(0.2, 0.4, 0.2, 1)

(0.2, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.4, 0.6, 1)

Mise à l'échelle de plusieurs couleurs

L'exemple suivant construit un objet Image à partir du fichier ColorBars2.bmp. Ensuite, le code ajuste les composantes rouge, vert et bleu de chaque pixel de l'image. Les composantes rouge sont ajustées par une diminution de 25 pour cent, les composantes vert par une diminution de 35 pour cent et les composantes bleu par une diminution de 50 pour cent.

Dim image As New Bitmap("ColorBars.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = { _
   New Single() {0.75F, 0, 0, 0, 0}, _
   New Single() {0, 0.65F, 0, 0, 0}, _
   New Single() {0, 0, 0.5F, 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, and the upper-left corner, width, 
' and height of the source rectangle as in the previous example.
e.Graphics.DrawImage( _
   image, _
   New Rectangle(150, 10, width, height), _
   0, 0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

Image image = new Bitmap("ColorBars.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = { 
   new float[] {.75F,  0,  0,  0, 0},
   new float[] {0,  .65F,  0,  0, 0},
   new float[] {0,  0,  .5F,  0, 0},
   new float[] {0,  0,  0,  1F, 0},
   new float[] {0, 0, 0, 0, 1F}};

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

L'illustration suivante montre l'image d'origine sur la gauche et l'image ajustée sur la droite.

Mise à l'échelle des couleurs

Le tableau suivant dresse la liste des vecteurs de couleurs pour les quatre barres situées de part et d'autre de l'ajustement du rouge, du vert et du bleu.

D'origine

Ajustée

(0.6, 0.6, 0.6, 1)

(0.45, 0.39, 0.3, 1)

(0, 1, 1, 1)

(0, 0.65, 0.5, 1)

(1, 1, 0, 1)

(0.75, 0.65, 0, 1)

(1, 0, 1, 1)

(0.75, 0, 0.5, 1)

Voir aussi

Référence

ColorMatrix

ImageAttributes

Autres ressources

Graphiques et dessins dans les Windows Forms

Recoloriage des images