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


Поворот цветов

Поворот в четырехмерном цветовом пространстве сложно визуализировать. Мы можем упростить визуализацию поворота, согласившись сохранить один из компонентов цвета фиксированным. Предположим, что мы согласны сохранить альфа-компонент фиксированным равным 1 (полностью непрозрачный). Затем можно визуализировать трехмерное цветовое пространство с красными, зелеными и синими осями, как показано на следующем рисунке.

иллюстрация представления перспективы трехмерного цветового пространства с осями, помеченными красным, зеленым и синим

Цвет можно рассматривать как точку в трехмерном пространстве. Например, точка (1, 0, 0) в пространстве представляет красный цвет, а точка (0, 1, 0) в пространстве представляет зеленый цвет.

На следующем рисунке показано, что означает поворот цвета (1, 0, 0) через угол 60 градусов в плоскости Red-Green. Поворот в плоскости, параллельной Red-Green, можно рассматривать как поворот вокруг синей оси.

иллюстрация, которая показывает точку (1, 0, 0), повёрнутую на 60 градусов до (0,5, 0,866, 0)

На следующем рисунке показано, как инициализировать цветовую матрицу для выполнения поворотов о каждой из трех осей координат (красный, зеленый, синий).

иллюстрация, показывающая цветные матрицы, выполняющие повороты о каждой из трех осей координат

В следующем примере берется изображение, которое является одним цветом (1, 0, 0.6) и применяется поворот на 60 градусов вокруг синей оси. Угол поворота описывается в плоскости, параллельной плоскости Red-Green.

Image            image(L"RotationInput.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();
REAL             degrees = 60;
REAL             pi = acos(-1);  // the angle whose cosine is -1.
REAL             r = degrees * pi / 180;  // degrees to radians

ColorMatrix colorMatrix = {
   cos(r),  sin(r), 0.0f, 0.0f, 0.0f,
   -sin(r), cos(r), 0.0f, 0.0f, 0.0f,
   0.0f,    0.0f,   1.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(130, 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);

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

иллюстрация, показывающая прямоугольники, заполненные оригинальным изображением (фиолетово-красное) и цветовым изображением после поворота (морской зеленый)

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

иллюстрация, показывающая трехмерное цветовое пространство, и точка (1.0, 0.0, 0.6), повернутая на 60 градусов до (0.5, 0.866, 0.6)