旋转颜色

在四维颜色空间中进行的旋转难以可视化。 通过协定将其中一个颜色组件保持固定不变,我们可以更轻松地可视化旋转。 假设我们一致协定将 alpha 组件固定在 1 处(完全不透明)。 然后,我们可以用红轴、绿轴和蓝轴来可视化一个三维颜色空间,如下图所示。

三维颜色空间透视视图的插图,其坐标轴标记为红色、绿色和蓝色

可以将颜色视为三维空间中的点。 例如,空间中的点 (1, 0, 0) 表示红色,空间中的点 (0, 1, 0) 表示绿色。

下图显示了在红-绿平面中通过 60 度的角度来旋转颜色 (1, 0, 0) 的意义。 可以将在与红-绿平面平行的平面中进行的旋转视为围绕蓝轴进行的旋转。

显示点 (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.6) 旋转 60 度到 (0.5、0.866、0.6)