Bagikan melalui


Cara: Menggunakan Matriks Warna untuk Mengubah Warna Tunggal

GDI+ menyediakan Image kelas dan Bitmap untuk menyimpan dan memanipulasi gambar. Image dan Bitmap objek menyimpan warna setiap piksel sebagai angka 32-bit: masing-masing 8 bit untuk merah, hijau, biru, dan alfa. Masing-masing dari empat komponen adalah angka dari 0 hingga 255, dengan 0 tidak mewakili intensitas dan 255 mewakili intensitas penuh. Komponen alfa menentukan transparansi warna: 0 sepenuhnya transparan, dan 255 sepenuhnya buram.

Vektor warna adalah 4 tuple bentuk (merah, hijau, biru, alfa). Misalnya, vektor warna (0, 255, 0, 255) mewakili warna buram yang tidak memiliki merah atau biru, tetapi memiliki hijau pada intensitas penuh.

Konvensi lain untuk mewakili warna menggunakan angka 1 untuk intensitas penuh. Dengan menggunakan konvensi tersebut, warna yang dijelaskan dalam paragraf sebelumnya akan diwakili oleh vektor (0, 1, 0, 1). GDI+ menggunakan konvensi 1 sebagai intensitas penuh saat melakukan transformasi warna.

Anda dapat menerapkan transformasi linier (rotasi, penskalaan, dan sejenisnya) ke vektor warna dengan mengalikan vektor warna dengan matriks 4×4. Namun, Anda tidak dapat menggunakan matriks 4×4 untuk melakukan terjemahan (nonlinear). Jika Anda menambahkan koordinat kelima dummy (misalnya, angka 1) ke setiap vektor warna, Anda dapat menggunakan matriks 5×5 untuk menerapkan kombinasi transformasi dan terjemahan linier. Transformasi yang terdiri dari transformasi linier diikuti dengan terjemahan disebut transformasi affine.

Misalnya, Anda ingin memulai dengan warna (0,2, 0,0, 0,4, 1,0) dan menerapkan transformasi berikut:

  1. Menggandakan komponen merah

  2. Tambahkan 0,2 ke komponen merah, hijau, dan biru

Perkalian matriks berikut akan melakukan pasangan transformasi dalam urutan yang tercantum.

Cuplikan layar matriks perkalian transformasi.

Elemen matriks warna diindeks (berbasis nol) menurut baris lalu kolom. Misalnya, entri di baris kelima dan kolom ketiga matriks M ditandai dengan M[4][2].

Matriks identitas 5×5 (ditunjukkan dalam ilustrasi berikut) memiliki 1s pada diagonal dan 0-an di tempat lain. Jika Anda mengalikan vektor warna dengan matriks identitas, vektor warna tidak berubah. Cara mudah untuk membentuk matriks transformasi warna adalah dengan memulai dengan matriks identitas dan membuat perubahan kecil yang menghasilkan transformasi yang diinginkan.

Cuplikan layar matriks identitas 5x5 untuk transformasi warna.

Untuk diskusi matriks dan transformasi yang lebih rinci, lihat Sistem Koordinat dan Transformasi.

Contoh

Contoh berikut mengambil gambar yang semuanya satu warna (0,2, 0,0, 0,4, 1,0) dan menerapkan transformasi yang dijelaskan dalam paragraf sebelumnya.

Ilustrasi berikut menunjukkan gambar asli di sebelah kiri dan gambar yang diubah di sebelah kanan.

Persegi ungu di sebelah kiri dan persegi fuchsia di sebelah kanan.

Kode dalam contoh berikut menggunakan langkah-langkah berikut untuk melakukan pewarnaan ulang:

  1. Menginisialisasi ColorMatrix objek.

  2. Buat ImageAttributes objek dan teruskan ColorMatrix objek ke SetColorMatrix metode ImageAttributes objek.

  3. Teruskan ImageAttributes objek ke DrawImage metode Graphics objek.

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

float[][] colorMatrixElements = {
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10);

e.Graphics.DrawImage(
   image,
   new Rectangle(120, 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("InputColor.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

' The following matrix consists of the following transformations:
' red scaling factor of 2
' green scaling factor of 1
' blue scaling factor of 1
' alpha scaling factor of 1
' three translations of 0.2
Dim colorMatrixElements As Single()() = { _
   New Single() {2, 0, 0, 0, 0}, _
   New Single() {0, 1, 0, 0, 0}, _
   New Single() {0, 0, 1, 0, 0}, _
   New Single() {0, 0, 0, 1, 0}, _
   New Single() {0.2F, 0.2F, 0.2F, 0, 1}}

Dim colorMatrix As New ColorMatrix(colorMatrixElements)

imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)

e.Graphics.DrawImage(image, 10, 10)

e.Graphics.DrawImage( _
   image, _
   New Rectangle(120, 10, width, height), _
   0, _
   0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

Mengompilasi Kode

Contoh sebelumnya dirancang untuk digunakan dengan Formulir Windows, dan memerlukan PaintEventArgs e, yang merupakan parameter penanganan Paint aktivitas.

Lihat juga