Практическое руководство. Циклический сдвиг цветовHow to: Rotate Colors

Поворот в четырехмерный цветовом пространстве сложно представить.Rotation in a four-dimensional color space is difficult to visualize. Мы можно упростить, если договориться сохранять один из компонентов цвета неизменным.We can make it easier to visualize rotation by agreeing to keep one of the color components fixed. Предположим, что требуется сохранить альфа-компонент, составляет 1 (полностью непрозрачный).Suppose we agree to keep the alpha component fixed at 1 (fully opaque). Затем мы можете визуализировать трехмерное цветовое пространство с осями красного, зеленого и синего, как показано на следующем рисунке.Then we can visualize a three-dimensional color space with red, green, and blue axes as shown in the following illustration.

Рисунок, показывающий поворота оси красного, зеленого и синего.

Цвет может рассматриваться как точка в трехмерном пространстве.A color can be thought of as a point in 3-D space. Например точка (1, 0, 0) в пространстве представляет красный цвет, а точки (0, 1, 0) в пространстве представляет зеленый цвет.For example, the point (1, 0, 0) in space represents the color red, and the point (0, 1, 0) in space represents the color green.

Ниже показан последствия поворот цвета (1, 0, 0) через угол 60 градусов в плоскости красный-зеленый.The following illustration shows what it means to rotate the color (1, 0, 0) through an angle of 60 degrees in the Red-Green plane. Поворот в плоскости плоскости красный-зеленый может рассматриваться как поворот относительно оси синий.Rotation in a plane parallel to the Red-Green plane can be thought of as rotation about the blue axis.

Рисунок, показывающий Поворот относительно оси синий.

Ниже показано, как создать матрицу цветов для выполнения поворотов о каждой из трех осей координат (красный, зеленый, синий):The following illustration shows how to initialize a color matrix to perform rotations about each of the three coordinate axes (red, green, blue):

Инициализируйте матрицы цветов для выполнения поворотов относительно трем осям.

ПримерExample

В следующем примере выполняются изображения, только один цвет (1 0, 0.6) и применяет поворот на 60 градусов относительно оси синий.The following example takes an image that is all one color (1, 0, 0.6) and applies a 60-degree rotation about the blue axis. Угол поворота заметает плоскость, параллельную плоскости красный зеленый.The angle of the rotation is swept out in a plane that is parallel to the red-green plane.

На следующем рисунке показано исходное изображение в левой части и преобразованное изображение справа:The following illustration shows the original image on the left and the color-rotated image on the right:

Иллюстрацию исходное изображение, преобразованное изображение.

На следующем рисунке показан поворот цвета, выполняемые в следующем коде:The following illustration shows a visualization of the color rotation performed in the following code:

Рисунок, показывающий визуализации поворот цветов.

private void RotateColors(PaintEventArgs e)
{
    Bitmap image = new Bitmap("RotationInput.bmp");
    ImageAttributes imageAttributes = new ImageAttributes();
    int width = image.Width;
    int height = image.Height;
    float degrees = 60f;
    double r = degrees * System.Math.PI / 180; // degrees to radians

    float[][] colorMatrixElements = { 
        new float[] {(float)System.Math.Cos(r),  (float)System.Math.Sin(r),  0,  0, 0},
        new float[] {(float)-System.Math.Sin(r),  (float)-System.Math.Cos(r),  0,  0, 0},
        new float[] {0,  0,  2,  0, 0},
        new float[] {0,  0,  0,  1, 0},
        new float[] {0, 0, 0, 0, 1}};

    ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

    imageAttributes.SetColorMatrix(
       colorMatrix,
       ColorMatrixFlag.Default,
       ColorAdjustType.Bitmap);

    e.Graphics.DrawImage(image, 10, 10, width, height);

    e.Graphics.DrawImage(
       image,
       new Rectangle(150, 10, width, height),  // destination rectangle 
        0, 0,        // upper-left corner of source rectangle 
        width,       // width of source rectangle
        height,      // height of source rectangle
        GraphicsUnit.Pixel,
       imageAttributes);

}
Private Sub RotateColors(ByVal e As PaintEventArgs)
    Dim image As Bitmap = New Bitmap("RotationInput.bmp")
    Dim imageAttributes As New ImageAttributes()
    Dim width As Integer = image.Width
    Dim height As Integer = image.Height
    Dim degrees As Single = 60.0F
    Dim r As Double = degrees * System.Math.PI / 180 ' degrees to radians
    Dim colorMatrixElements As Single()() = { _
       New Single() {CSng(System.Math.Cos(r)), _
                     CSng(System.Math.Sin(r)), 0, 0, 0}, _
       New Single() {CSng(-System.Math.Sin(r)), _
                     CSng(-System.Math.Cos(r)), 0, 0, 0}, _
       New Single() {0, 0, 2, 0, 0}, _
       New Single() {0, 0, 0, 1, 0}, _
       New Single() {0, 0, 0, 0, 1}}

    Dim colorMatrix As New ColorMatrix(colorMatrixElements)

    imageAttributes.SetColorMatrix( _
       colorMatrix, _
       ColorMatrixFlag.Default, _
       ColorAdjustType.Bitmap)

    e.Graphics.DrawImage(image, 10, 10, width, height)

    ' Pass in the destination rectangle (2nd argument), the upper-left corner 
    ' (3rd and 4th arguments), width (5th argument),  and height (6th 
    ' argument) of the source rectangle.
    e.Graphics.DrawImage( _
       image, _
       New Rectangle(150, 10, width, height), _
       0, 0, _
       width, _
       height, _
       GraphicsUnit.Pixel, _
       imageAttributes)
End Sub

Компиляция кодаCompiling the Code

Предыдущий пример предназначен для работы с Windows Forms и требует PaintEventArgs e, который является параметром Paint обработчик событий.The preceding example is designed for use with Windows Forms, and it requires PaintEventArgs e, which is a parameter of the Paint event handler. Замените RotationInput.bmp в вашей системе путь и имя файла изображения.Replace RotationInput.bmp with an image file name and path valid on your system.

См. такжеSee also