Utilizzo delle trasformazioni per scalare i coloriUsing Transformations to Scale Colors

Una trasformazione di ridimensionamento Moltiplica uno o più di quattro componenti di colore da un numero.A scaling transformation multiplies one or more of the four color components by a number. Le voci della matrice di colori che rappresentano l'adattamento sono indicate nella tabella riportata di seguito.The color matrix entries that represent scaling are given in the following table.

Componente scalabilitàComponent to be scaled Voce della matriceMatrix entry
RossoRed [0][0][0][0]
VerdeGreen [1][1][1][1]
BluBlue [2][2][2][2]
AlfaAlpha [3][3][3][3]

Adattamento di un coloreScaling One Color

Nell'esempio seguente viene costruito un Image oggetto dal file Colorbars2.The following example constructs an Image object from the file ColorBars2.bmp. Il codice quindi ridimensiona il componente blu di ciascun pixel nell'immagine di un fattore pari a 2.Then the code scales the blue component of each pixel in the image by a factor of 2. L'immagine originale viene disegnato accanto all'immagine trasformata.The original image is drawn alongside the transformed image.

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

Nella figura seguente mostra l'immagine originale a sinistra e l'immagine adattata a destra.The following illustration shows the original image on the left and the scaled image on the right.

Scalare i coloriScale Colors

Nella tabella seguente sono elencati i vettori di colore per le quattro barre prima e dopo il ridimensionamento blu.The following table lists the color vectors for the four bars before and after the blue scaling. Si noti che il componente blu nella quarta barra di colore è passato da 0,8 a 0,6.Note that the blue component in the fourth color bar went from 0.8 to 0.6. Ciò accade perché GDI+GDI+ mantiene solo la parte frazionaria del risultato.That is because GDI+GDI+ retains only the fractional part of the result. Ad esempio, (2)(0.8) = 1.6, e la parte frazionaria 1.6 è 0,6.For example, (2)(0.8) = 1.6, and the fractional part of 1.6 is 0.6. Mantenendo solo la parte frazionaria assicura che il risultato è sempre nell'intervallo [0, 1].Retaining only the fractional part ensures that the result is always in the interval [0, 1].

OriginaleOriginal ScalaScaled
(0.4, 0.4, 0.4, 1)(0.4, 0.4, 0.4, 1) (0.4, 0.4, 0.8, 1)(0.4, 0.4, 0.8, 1)
(0.4, 0.2, 0.2, 1)(0.4, 0.2, 0.2, 1) (0.4, 0.2, 0.4, 1)(0.4, 0.2, 0.4, 1)
(0.2, 0.4, 0.2, 1)(0.2, 0.4, 0.2, 1) (0.2, 0.4, 0.4, 1)(0.2, 0.4, 0.4, 1)
(0.4, 0.4, 0.8, 1)(0.4, 0.4, 0.8, 1) (0.4, 0.4, 0.6, 1)(0.4, 0.4, 0.6, 1)

Adattamento dei colori piùScaling Multiple Colors

Nell'esempio seguente viene costruito un Image oggetto dal file Colorbars2.The following example constructs an Image object from the file ColorBars2.bmp. Il codice quindi ridimensiona i componenti rossi, verde e blu di ciascun pixel dell'immagine.Then the code scales the red, green, and blue components of each pixel in the image. I componenti rossi sono ridotte del 25% e vengono ridimensionati i componenti di colore verde del 35% vengono ridimensionati i componenti di colore blu del 50%.The red components are scaled down 25 percent, the green components are scaled down 35 percent, and the blue components are scaled down 50 percent.

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

Nella figura seguente mostra l'immagine originale a sinistra e l'immagine adattata a destra.The following illustration shows the original image on the left and the scaled image on the right.

Scalare i coloriScale Colors

Nella tabella seguente sono elencati i vettori di colore per le quattro barre prima e dopo il ridimensionamento rosso, verde e blu.The following table lists the color vectors for the four bars before and after the red, green and blue scaling.

OriginaleOriginal ScalaScaled
(0.6, 0.6, 0.6, 1)(0.6, 0.6, 0.6, 1) (0.45, 0.39, 0.3, 1)(0.45, 0.39, 0.3, 1)
(0, 1, 1, 1)(0, 1, 1, 1) (0, 0.65, 0.5, 1)(0, 0.65, 0.5, 1)
(1, 1, 0, 1)(1, 1, 0, 1) (0.75, 0.65, 0, 1)(0.75, 0.65, 0, 1)
(1, 0, 1, 1)(1, 0, 1, 1) (0.75, 0, 0.5, 1)(0.75, 0, 0.5, 1)

Vedere ancheSee Also

ColorMatrix
ImageAttributes
Grafica e disegno in Windows FormGraphics and Drawing in Windows Forms
Ricolorazione di immaginiRecoloring Images