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


Цвета масштабирования

Преобразование масштабирования умножает один или несколько из четырех компонентов цвета на число. Элементы цветовой матрицы, представляющие масштабирование, приведены в таблице ниже.

Масштабируемый компонент Элемент матрицы
Красный [0][0]
Зеленый [1][1]
Синий [2][2]
Коэффициент альфа [3][3]

 

В следующем примере создается объект Image из файла ColorBars2.bmp. Затем код масштабирует синий компонент каждого пикселя на изображении с коэффициентом 2. Исходное изображение рисуется рядом с преобразованным.

Image            image(L"ColorBars2.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();

ColorMatrix colorMatrix = {
   1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
   0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
   0.0f, 0.0f, 2.0f, 0.0f, 0.0f,
   0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
   0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
   
imageAttributes.SetColorMatrix(
   &colorMatrix, 
   ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
   
graphics.DrawImage(&image, 10, 10, width, height);

graphics.DrawImage(
   &image, 
   Rect(150, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel,
   &imageAttributes);

На следующем рисунке показано исходное изображение слева и масштабированное изображение справа.

Показывает четыре цветные полосы, а затем одинаковые полосы с разными цветами.

В следующей таблице показаны цветовые векторы для четырех полос до и после синего масштабирования. Обратите внимание, что синий компонент в четвертой полосе изменился с 0,8 на 0,6. Это связано с тем, что интерфейс GDI+ сохраняет только дробную часть результата. Например, (2)(0,8) = 1,6, а дробная часть 1,6 равна 0,6. Сохранение только дробной части гарантирует, что результат всегда будет находиться в интервале [0, 1].

До преобразования После масштабирования
(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)

 

В следующем примере создается объект Image из файла ColorBars2.bmp. Затем код масштабирует красные, зеленые и синие компоненты каждого пикселя на изображении. Красные компоненты масштабируются в сторону уменьшения на 25 процентов, зеленые компоненты — на 35 процентов, а синие — на 50 процентов.

Image            image(L"ColorBars.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();

ColorMatrix colorMatrix = {
   0.75f, 0.0f,  0.0f, 0.0f, 0.0f,
   0.0f,  0.65f, 0.0f, 0.0f, 0.0f,
   0.0f,  0.0f,  0.5f, 0.0f, 0.0f,
   0.0f,  0.0f,  0.0f, 1.0f, 0.0f,
   0.0f,  0.0f,  0.0f, 0.0f, 1.0f};
   
imageAttributes.SetColorMatrix(
   &colorMatrix, 
   ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);
   
graphics.DrawImage(&image, 10, 10, width, height);

graphics.DrawImage(
   &image, 
   Rect(150, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel,
   &imageAttributes);

На следующем рисунке показано исходное изображение слева и масштабированное изображение справа.

иллюстрация с четырьмя цветными полосами, а затем эти полосы с разными цветами

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

До преобразования После масштабирования
(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)