Udostępnij przez


Używanie przekształceń do skalowania kolorów

Transformacja skalowania mnoży co najmniej jeden z czterech składników kolorów przez liczbę. Wpisy macierzy kolorów reprezentujące skalowanie są podane w poniższej tabeli.

Składnik do skalowania Element macierzy
Czerwony [0][0]
Zielony [1][1]
Niebieski [2][2]
Alfa [3][3]

Skalowanie jednego koloru

Poniższy przykład tworzy obiekt Image z pliku ColorBars2.bmp. Następnie kod skaluje niebieski składnik każdego piksela na obrazie przez współczynnik 2. Oryginalny obraz jest rysowany obok przekształconego obrazu.

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)

Poniższa ilustracja przedstawia oryginalny obraz po lewej stronie i skalowany obraz po prawej stronie:

Zrzut ekranu przedstawiający porównanie oryginalnych i skalowanych kolorów.

W poniższej tabeli wymieniono wektory kolorów dla czterech pasków przed i po niebieskim skalowaniu. Należy zauważyć, że niebieski składnik na czwartym pasku kolorów poszedł z zakresu od 0,8 do 0,6. Wynika to z faktu, że GDI+ zachowuje tylko część ułamkową wyniku. Na przykład (2)(0,8) = 1,6, a część ułamkowa 1,6 wynosi 0,6. Zachowanie tylko części ułamkowej gwarantuje, że wynik jest zawsze w interwale [0, 1].

Oryginał Skalowany
(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)

Skalowanie wielu kolorów

Poniższy przykład tworzy obiekt Image z pliku ColorBars2.bmp. Następnie kod skaluje czerwone, zielone i niebieskie składniki każdego piksela na obrazie. Czerwone składniki są skalowane w dół o 25 procent, zielone składniki są skalowane w dół o 35 procent, a niebieskie składniki są skalowane w dół o 50 procent.

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)

Poniższa ilustracja przedstawia oryginalny obraz po lewej stronie i skalowany obraz po prawej stronie:

Zrzut ekranu, który porównuje oryginalne i skalowane czerwone, zielone i niebieskie składniki.

W poniższej tabeli wymieniono wektory kolorów dla czterech pasków przed i po czerwonym, zielonym i niebieskim skalowaniu.

Oryginał Skalowany
(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)

Zobacz także