Цвета масштабирования
Преобразование масштабирования умножает один или несколько из четырех компонентов цвета на число. Элементы цветовой матрицы, представляющие масштабирование, приведены в таблице ниже.
Масштабируемый компонент | Элемент матрицы |
---|---|
Красный | [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) |