Share via


Rotieren von Farben

In einem vierdimensionalen Farbraum sind Drehungen schwierig zu visualisieren. Wir können das Visualisieren von Drehungen vereinfachen, indem wir eine der Farbkomponenten festlegen. Angenommen, wir legen die Alphakomponente auf 1 (vollkommen undurchsichtig) fest. Dann können wir (wie in der folgenden Abbildung dargestellt) einen dreidimensionalen Farbraum mit roten, grünen und blauen Achsen visualisieren.

Abbildung einer Perspektivansicht eines dreidimensionalen Farbraums mit achsenbeschrifteten Rot-, Grün- und Blaubezeichnungen

Eine Farbe kann als Punkt im 3D-Raum betrachtet werden. Beispielsweise stellt der Punkt (1, 0, 0) im Raum die Farbe Rot und der Punkt (0, 1, 0) im Raum die Farbe Grün dar.

In den folgenden Abbildungen wird gezeigt, was bei einer Drehung der Farbe (1, 0, 0) um einen Winkel von 60 Grad in der Rot-Grün-Ebene geschieht. Die Drehung auf einer Ebene, die parallel zur Rot-Grün-Ebene ist, kann als Drehung der blauen Achse verstanden werden.

Abbildung des Punkts (1, 0, 0) gedreht um 60 Grad auf (0,5, 0,866, 0)

Die folgende Abbildung zeigt, wie Sie eine Farbmatrix initialisieren, um Drehungen über jede der drei Koordinatenachsen (rot, grün, blau) durchzuführen.

Abbildung mit Farbmatrizen, die Drehungen über jede der drei Koordinatenachsen ausführen

Im folgenden Beispiel wird ein Bild verwendet, das nur die Farbe (1, 0, 0.6) hat, und es wird eine 60 Grad-Drehung um die blaue Achse durchgeführt. Der Drehwinkel wird in einer Ebene herausgefegt, die parallel zur Red-Green Ebene ist.

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);

Die folgende Abbildung zeigt das Originalbild links und das farbrotierte Bild auf der rechten Seite.

Abbildung: Rechtecke, die mit dem Originalbild gefüllt sind (violett rot) und farbrotiertes Bild (meergrün)

Die im vorherigen Codebeispiel durchgeführte Farbrotation kann wie folgt visualisiert werden.

Abbildung eines 3D-Farbraums, und der Punkt (1, 0, 0,6) wurde um 60 Grad gedreht bis (0,5, 0,866, 0,6)