Porady: zmienianie kolorów

Ścinanie zwiększa lub zmniejsza składnik koloru o ilość proporcjonalną do innego składnika koloru. Rozważmy na przykład przekształcenie, w którym czerwony składnik jest zwiększany o połowę wartości niebieskiego składnika. W ramach takiej transformacji kolor (0,2, 0,5, 1) stałby się (0,7, 0,5, 1). Nowy czerwony składnik to 0,2 + (1/2)(1) = 0,7.

Przykład

Poniższy przykład tworzy Image obiekt z pliku ColorBars4.bmp. Następnie kod stosuje transformację ścinającą opisaną w poprzednim akapicie do każdego piksela na obrazie.

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

Two squares with colored stripes side-by-side illustrating the original image and the sheared image.

W poniższej tabeli wymieniono wektory kolorów dla czterech pasków przed i po przekształceniu ścinania.

Oryginalne Ścięty
(0, 0, 1, 1) (0.5, 0, 1, 1)
(0.5, 1, 0.5, 1) (0.75, 1, 0.5, 1)
(1, 1, 0, 1) (1, 1, 0, 1)
(0.4, 0.4, 0.4, 1) (0.6, 0.4, 0.4, 1)
Image image = new Bitmap("ColorBars.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.5f,  0,  1,  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 = 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() {1, 0, 0, 0, 0}, _
        New Single() {0, 1, 0, 0, 0}, _
        New Single() {0.5F, 0, 1, 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)

e.Graphics.DrawImage(image, New Rectangle(150, 10, width, height), 0, 0, _
    width, height, GraphicsUnit.Pixel, imageAttributes)

Kompilowanie kodu

Powyższy przykład jest przeznaczony do użycia z formularzami Windows Forms i wymaga PaintEventArgseparametru , który jest parametrem Paint programu obsługi zdarzeń. Zastąp ColorBars.bmp ciąg nazwą obrazu i ścieżką prawidłową w systemie.

Zobacz też