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

Ölçeklendirme dönüştürmesi bir veya daha fazla dört renk bileşeninden bir sayı ile çarpar. Ölçeklendirmeyi temsil eden renk matrisi girdileri aşağıdaki tabloda verilmiştir.

Ölçeklendirilen bileşen Matris girişi
Kırmızı Template Template
Yeşil 1 1
Mavi iki iki
Alfa 03 03

Bir rengi ölçekleme

Aşağıdaki örnek Image ColorBars2.bmp dosyadan bir nesne oluşturur. Ardından kod, görüntüdeki her pikselin mavi bileşenini 2 faktörüyle ölçeklendirir. Özgün görüntü, dönüştürülmüş 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, sol taraftaki orijinal görüntü ve sağ taraftaki ölçeklendirilmiş görüntü gösterilmektedir:

Screenshot that compares the original and scaled colors.

Aşağıdaki tabloda, mavi ölçeklendirmeden önce ve sonra dört çubuk için renk vektörleri listelenmektedir. Dördüncü renk çubuğundaki mavi bileşenin 0,8 ' den 0,6 ' e gittiğini unutmayın. bunun nedeni GDI+ yalnızca sonucun kesirli kısmını korur. Örneğin, (2) (0.8) = 1,6 ve 1,6 ' nin kesirli bölümü 0,6. Yalnızca kesirli kısmını saklamak, sonucun her zaman [0, 1] aralığında olmasını sağlar.

Özgün Ölçeklenebilir
(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çekleme

Aşağıdaki örnek Image ColorBars2.bmp dosyadan bir nesne oluşturur. Ardından kod, görüntüdeki her bir pikselin kırmızı, yeşil ve mavi bileşenlerini ölçeklendirir. Kırmızı bileşenler yüzde 25 ' i aşağı ölçeklenirse, yeşil bileşenler yüzde 35 ' luk şekilde ölçeklendirilir ve mavi bileşenler yüzde 50 ' ye ölçeklenmiştir.

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, sol taraftaki orijinal görüntü ve sağ taraftaki ölçeklendirilmiş görüntü gösterilmektedir:

Screenshot that compares the original and scaled colors.

Aşağıdaki tabloda, kırmızı, yeşil ve mavi ölçeklendirmeden önce ve sonra dört çubuk için renk vektörleri listelenmektedir.

Özgün Ölçeklenebilir
(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.