Поделиться через


Применение гамма-коррекции к градиенту

Вы можете включить гамма-коррекцию для кисти градиента, передав true методу PathGradientBrush::SetGammaCorrection этой кисти. Вы можете отключить гамма-коррекцию, передав значение FALSE методу PathGradientBrush::SetGammaCorrection . Гамма-коррекция по умолчанию отключена.

В следующем примере создается линейная кисть градиента, которая используется для заполнения двух прямоугольников. Первый прямоугольник заполняется без гамма-коррекции, а второй — гамма-коррекцией.

LinearGradientBrush linGrBrush(
   Point(0, 10),
   Point(200, 10),
   Color(255, 255, 0, 0),   // Opaque red
   Color(255, 0, 0, 255));  // Opaque blue

graphics.FillRectangle(&linGrBrush, 0, 0, 200, 50);
linGrBrush.SetGammaCorrection(TRUE);
graphics.FillRectangle(&linGrBrush, 0, 60, 200, 50); 

На рисунке ниже показаны эти два заполненных прямоугольника. Верхний прямоугольник, который не имеет гамма-коррекции, становится темным в середине. Нижний прямоугольник, имеющий гамма-коррекцию имеет более равномерное значение интенсивности цветов.

Иллюстрация, показывающая два прямоугольника: цветная заливка первого отличается по интенсивности, заливка второго меньше

В следующем примере создается кисть градиента пути на основе star контура. Код использует кисть градиента пути с отключенной гамма-коррекцией (по умолчанию) для заполнения пути. Затем код передает значение TRUE методу PathGradientBrush::SetGammaCorrection , чтобы включить гамма-коррекцию для кисти градиента пути. Вызов Graphics::TranslateTransform задает преобразование мира объекта Graphics таким образом, что последующий вызов Graphics::FillPath заполняет star, расположенную справа от первого star.

// Put the points of a polygon in an array.
Point points[] = {Point(75, 0), Point(100, 50), 
                  Point(150, 50), Point(112, 75),
                  Point(150, 150), Point(75, 100), 
                  Point(0, 150), Point(37, 75), 
                  Point(0, 50), Point(50, 50)};

// Use the array of points to construct a path.
GraphicsPath path;
path.AddLines(points, 10);

// Use the path to construct a path gradient brush.
PathGradientBrush pthGrBrush(&path);

// Set the color at the center of the path to red.
pthGrBrush.SetCenterColor(Color(255, 255, 0, 0));

// Set the colors of the points in the array.
Color colors[] = {Color(255, 0, 0, 0),   Color(255, 0, 255, 0),
                  Color(255, 0, 0, 255), Color(255, 255, 255, 255), 
                  Color(255, 0, 0, 0),   Color(255, 0, 255, 0), 
                  Color(255, 0, 0, 255), Color(255, 255, 255, 255),
                  Color(255, 0, 0, 0),   Color(255, 0, 255, 0)};

int count = 10;
pthGrBrush.SetSurroundColors(colors, &count);

// Fill the path with the path gradient brush.
graphics.FillPath(&pthGrBrush, &path);
pthGrBrush.SetGammaCorrection(TRUE);
graphics.TranslateTransform(200.0f, 0.0f);
graphics.FillPath(&pthGrBrush, &path);

На следующем рисунке показаны выходные данные предыдущего кода. Справа star имеет гамма-коррекцию. Обратите внимание, что star слева без гамма-коррекции содержит области, которые кажутся темными.

Иллюстрация двух пятиконечных начинается с цветной градиентной заливки; первый имеет темные области, второй — нет