Transformaties gebruiken om kleuren te schalen

Een schaaltransformatie vermenigvuldigt een of meer van de vier kleuronderdelen met een getal. De kleurmatrixvermeldingen die schalen vertegenwoordigen, worden gegeven in de volgende tabel.

Onderdeel dat geschaald moet worden Matrixinvoer
Rood [0][0]
Groen [1][1]
Blauw [2][2]
Alfa [3][3]

Eén kleur schalen

In het volgende voorbeeld wordt een Image-object samengesteld uit het bestand ColorBars2.bmp. Vervolgens wordt met de code het blauwe onderdeel van elke pixel in de afbeelding geschaald met een factor van 2. De oorspronkelijke afbeelding wordt getekend naast de getransformeerde afbeelding.

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)

In de volgende afbeelding ziet u de oorspronkelijke afbeelding aan de linkerkant en de geschaalde afbeelding aan de rechterkant:

Schermopname die de oorspronkelijke en geschaalde kleuren vergelijkt.

De volgende tabel bevat de kleurvectoren voor de vier balken vóór en na de blauwe schaalaanpassing. Houd er rekening mee dat het blauwe onderdeel in de vierde kleurenbalk is gegaan van 0,8 tot 0,6. Dat komt doordat GDI+ alleen het breukdeel van het resultaat behoudt. Bijvoorbeeld: (2)(0,8) = 1,6 en het breukdeel van 1,6 is 0,6. Door alleen het breukdeel te behouden, zorgt u ervoor dat het resultaat altijd binnen het interval [0, 1] valt.

Originele Tekst Geschaald
(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)

Het schalen van meerdere kleuren

In het volgende voorbeeld wordt een Image-object samengesteld uit het bestand ColorBars2.bmp. Vervolgens worden de rode, groene en blauwe onderdelen van elke pixel in de afbeelding geschaald. De rode onderdelen worden 25 procent omlaag geschaald, de groene onderdelen worden 35 procent omlaag geschaald en de blauwe onderdelen worden 50 procent omlaag geschaald.

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)

In de volgende afbeelding ziet u de oorspronkelijke afbeelding aan de linkerkant en de geschaalde afbeelding aan de rechterkant:

Schermopname die de oorspronkelijke en geschaalde rode, groene en blauwe onderdelen vergelijkt.

De volgende tabel bevat de kleurvectoren voor de vier balken vóór en na de rode, groene en blauwe schaalaanpassing.

Originele Tekst Geschaald
(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)

Zie ook