Menggunakan Transformasi untuk Menskalakan Warna
Transformasi penskalaan mengalikan satu atau beberapa dari empat komponen warna dengan angka. Entri matriks warna yang mewakili penskalakan diberikan dalam tabel berikut.
Komponen yang akan diskalakan | Entri matriks |
---|---|
Merah | [0][0] |
Hijau | [1][1] |
Biru | [2][2] |
Alpha | [3][3] |
Menskalakan Satu Warna
Contoh berikut membuat Image objek dari file ColorBars2.bmp. Kemudian kode menskalakan komponen biru dari setiap piksel dalam gambar dengan faktor 2. Gambar asli digambar bersama gambar yang diubah.
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)
Ilustrasi berikut menunjukkan gambar asli di sebelah kiri dan gambar berskala di sebelah kanan:
Tabel berikut mencantumkan vektor warna untuk empat bilah sebelum dan sesudah penskalaan biru. Perhatikan bahwa komponen biru di bilah warna keempat berubah dari 0,8 menjadi 0,6. Itu karena GDI+ hanya mempertahankan bagian pecahan dari hasil. Misalnya, (2)(0,8) = 1,6, dan bagian pecahan 1,6 adalah 0,6. Hanya mempertahankan bagian pecahan memastikan bahwa hasilnya selalu dalam interval [0, 1].
Original | Skala |
---|---|
(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) |
Menskalakan Beberapa Warna
Contoh berikut membuat Image objek dari file ColorBars2.bmp. Kemudian kode menskalakan komponen merah, hijau, dan biru dari setiap piksel dalam gambar. Komponen merah diskalakan turun 25 persen, komponen hijau diturunkan skalanya 35 persen, dan komponen biru diskalakan turun 50 persen.
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)
Ilustrasi berikut menunjukkan gambar asli di sebelah kiri dan gambar berskala di sebelah kanan:
Tabel berikut mencantumkan vektor warna untuk empat bilah sebelum dan sesudah penskalaan merah, hijau, dan biru.
Original | Skala |
---|---|
(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) |
Baca juga
.NET Desktop feedback