Renkleri Ölçeklendirmek için Dönüştürmeleri Kullanma

Ölçeklendirme dönüşümü, dört renk bileşeninden birini veya daha fazlasını bir sayı ile çarpar. Ölçeklendirmeyi temsil eden renk matrisi girişleri aşağıdaki tabloda verilmiştir.

Ölçeklendirilecek bileşen Matris girişi
Kırmızı [0][0]
Yeşil [1][1]
Mavi [2][2]
Alfa [3][3]

Bir Rengi Ölçeklendirme

Aşağıdaki örnek ColorBars2.bmp dosyasından bir Image nesne oluşturur. Ardından kod görüntüdeki her pikselin mavi bileşenini 2 kat ölçeklendirir. Özgün görüntü, dönüştürülen görüntüyle birlikte çizilir.

Image image = new Bitmap("ColorBars2.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
   new float[] {1,  0,  0,  0, 0},
   new float[] {0,  1,  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);
Dim image As New Bitmap("ColorBars2.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = { _
   New Single() {1, 0, 0, 0, 0}, _
   New Single() {0, 1, 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)

Aşağıdaki çizimde, soldaki özgün görüntü ve sağda ölçeklendirilmiş görüntü gösterilmektedir:

Screenshot that compares the original and scaled colors.

Aşağıdaki tabloda, mavi ölçeklendirmeden önceki ve sonraki dört çubuğun renk vektörleri listeleniyor. Dördüncü renk çubuğundaki mavi bileşenin 0,8'den 0,6'ya çıktığını unutmayın. Bunun nedeni GDI+'nın sonucun yalnızca kesirli kısmını tutmasıdır. Örneğin, (2)(0,8) = 1,6 ve 1,6'nın kesirli kısmı 0,6'dır. Yalnızca kesirli bölümün korunması sonucun her zaman [0, 1] aralığında olmasını sağlar.

Özgün Ölçekli
(0.4, 0.4, 0.4, 1) (0.4, 0.4, 0.8, 1)
(0.4, 0.2, 0.2, 1) (0.4, 0.2, 0.4, 1)
(0.2, 0.4, 0.2, 1) (0.2, 0.4, 0.4, 1)
(0.4, 0.4, 0.8, 1) (0.4, 0.4, 0.6, 1)

Birden Çok Rengi Ölçeklendirme

Aşağıdaki örnek ColorBars2.bmp dosyasından bir Image nesne oluşturur. Ardından kod, görüntüdeki her pikselin kırmızı, yeşil ve mavi bileşenlerini ölçeklendirir. Kırmızı bileşenlerin ölçeği yüzde 25 azaltılır, yeşil bileşenler yüzde 35 azaltılır ve mavi bileşenler yüzde 50 azaltılır.

Image image = new Bitmap("ColorBars.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
   new float[] {.75F,  0,  0,  0, 0},
   new float[] {0,  .65F,  0,  0, 0},
   new float[] {0,  0,  .5F,  0, 0},
   new float[] {0,  0,  0,  1F, 0},
   new float[] {0, 0, 0, 0, 1F}};

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);
Dim image As New Bitmap("ColorBars.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = { _
   New Single() {0.75F, 0, 0, 0, 0}, _
   New Single() {0, 0.65F, 0, 0, 0}, _
   New Single() {0, 0, 0.5F, 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, and the upper-left corner, width, 
' and height of the source rectangle as in the previous example.
e.Graphics.DrawImage( _
   image, _
   New Rectangle(150, 10, width, height), _
   0, 0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

Aşağıdaki çizimde, soldaki özgün görüntü ve sağda ölçeklendirilmiş görüntü gösterilmektedir:

Screenshot that compares the original and scaled red, green, and blue components.

Aşağıdaki tabloda kırmızı, yeşil ve mavi ölçeklendirmeden önceki ve sonraki dört çubuğun renk vektörleri listeleniyor.

Özgün Ölçekli
(0.6, 0.6, 0.6, 1) (0.45, 0.39, 0.3, 1)
(0, 1, 1, 1) (0, 0.65, 0.5, 1)
(1, 1, 0, 1) (0.75, 0.65, 0, 1)
(1, 0, 1, 1) (0.75, 0, 0.5, 1)

Ayrıca bkz.