旋转颜色
在四维颜色空间中进行的旋转难以可视化。 通过协定将其中一个颜色组件保持固定不变,我们可以更轻松地可视化旋转。 假设我们一致协定将 alpha 组件固定在 1 处(完全不透明)。 然后,我们可以用红轴、绿轴和蓝轴来可视化一个三维颜色空间,如下图所示。
可以将颜色视为三维空间中的点。 例如,空间中的点 (1, 0, 0) 表示红色,空间中的点 (0, 1, 0) 表示绿色。
下图显示了在红-绿平面中通过 60 度的角度来旋转颜色 (1, 0, 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);
下图左侧显示原始图像,右侧显示彩色旋转图像。
上述代码示例中执行的颜色旋转可以可视化,如下所示。