Nasıl yapılır: Renkleri Döndürme
Dört boyutlu bir renk boşluğunda döndürmeyi görselleştirmek zordur. Renk bileşenlerinden birini sabit tutmaya karar verdiyerek döndürmeyi görselleştirmeyi kolaylaştırabilirsiniz. Alfa bileşenini 1 (tamamen opak) olarak sabit tutmaya karar verdik. Ardından, aşağıdaki çizimde gösterildiği gibi kırmızı, yeşil ve mavi eksenlere sahip üç boyutlu bir renk alanı görselleştirebilirsiniz.

Renk, 3D alanda bir nokta olarak düşün olabilir. Örneğin, boşlukta nokta (1, 0, 0) kırmızı rengi, boşlukta nokta (0, 1, 0) ise yeşil rengi temsil eder.
Aşağıdaki çizimde rengin (1, 0, 0) düzlemde 60 derecelik bir açıyla döndürülerek ne Red-Green gösterilmiştir. Tek düzleme paralel bir düzlemde Red-Green mavi eksende döndürme olarak düşünebilirsiniz.

Aşağıdaki çizimde, üç koordinat ekseninin her biri (kırmızı, yeşil, mavi) hakkında döndürmeler gerçekleştirmek için bir renk matrisinin nasıl başlatılmış olduğu gösterilmiştir:

Örnek
Aşağıdaki örnek, tek renk (1, 0, 0,6) olan ve mavi eksene 60 derece döndürme uygulanan bir görüntü alır. Döndürme açısı, kırmızı-yeşil düzleme paralel bir düzlemde çıkar.
Aşağıdaki çizimde, sol tarafta özgün görüntü ve sağ tarafta renk döndürülmüş görüntü gösterilmiştir:

Aşağıdaki çizimde, aşağıdaki kodda gerçekleştirilen renk döndürme görselleştirmesi gösterilmiştir:

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
Kod Derleniyor
Yukarıdaki örnek, Windows Forms ile birlikte kullanım için tasarlanmıştır ve olay PaintEventArgs e işleyicinin bir parametresi Paint olan 'i gerektirir. yerine RotationInput.bmp sisteminiz üzerinde geçerli olan bir görüntü dosyası adı ve yolu yazın.