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.

Kırmızı, yeşil ve mavi eksenlerle döndürmeyi gösteren çizim.

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.

Mavi eksenle ilgili döndürmeyi gösteren çizim.

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:

Yaklaşık üç eksende döndürmeler yapmak için bir renk matrisi başlatma.

Ö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:

Özgün görüntüyü ve renk döndürülmüş görüntüyü gösteren çizim.

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

Renk döndürme görselleştirmesini gösteren çizim.

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.

Ayrıca bkz.