ALGORITMA TRANSFORMASI RUANG WARNA

RGB, HexTriplet, HSL, HSV, HSI, HCL, YUV, YDbDr, YIQ, YCbCr

DENGAN BAHASA PEMROGRAMAN

VISUAL BASIC 6, VISUAL BASIC.NET, C#.NET, dan JAVA

HSL, HSV RGB HSI, HCL YUV, YDbDr Visual Basic 6, Visual HEXTriplet YIQ, YCbCr Basic.NET, C#.NET, JAVA

Ericks Rachmat Swedia Margi Cahyanti

i

KATA PENGANTAR

Ruang warna adalah sebuah model matematis yang menjelaskan tentang bagaimana cara warna direpresentasikan dalam angka. Monitor komputer menggunakan ruang warna yang disebut dengan RGB (Red Green Blue), sehingga data-data citra yang tersimpan dalam komputer adalah angka-angka (disebut juga dengan pixel) yang merepresentasikan warna Red, Green dan Blue.

Pemahaman tentang algoritma ruang warna sangat dibutuhkan untuk menganalisis citra, karena dengan menggunakan ruang-ruang warna inilah kita selanjutnya dapat mengklasifikasikan citra, mendeteksi objek dalam citra, mengkompresi ukuran citra dan lain sebagainya.

Buku ini akan memandu anda langkah per langkah dengan cepat dan mudah dalam memahami algoritma-algoritma ruang warna, terutama dalam melakukan transformasi antar ruang warna, dan implementasinya kedalam bahasa pemrograman Visual Basic 6, Visual Basic.Net, C# dan Java. Semua function dan method yang ada dalam buku ini telah di-run dan di-compile. Untuk Visual Basic menggunakan compiler Visual Basic dengan Service Pack 6. Untuk Visual Basic.Net dan C#.Net dapat digunakan compiler di versi 2005, 2008 dan versi terbaru 2010. Untuk Java menggunakan Netbeans versi 6.7.1. Project lengkap serta semua source code dalam buku ini juga tersedia didalam CD.

Buku ini dapat digunakan oleh para mahasiswa strata satu, strata dua bahkan strata tiga, dalam melakukan penelitian tugas akhir, juga para pengajar, peneliti dan praktisi, terutama yang bergelut dibidang pengolahan citra. Buku ini juga bisa dipakai sebagai bahan ajar dalam matakuliah-matakuliah yang membahas tentang citra.

Semoga buku ini dapat memberikan informasi yang bermanfaat bagi semua pembaca.

Depok, Juli 2010

Ericks Rachmat Swedia Margi Cahyanti

i

DAFTAR ISI

KATA PENGANTAR ………………………………………………………………………..… i

DAFTAR ISI …………………………………………………………………………………… ii

I. RUANG WARNA PADA CITRA ………………………………………………………. 1 I.1 RGB ………………………………………………………………………………. 1 I.2 HSL ……………………………………………………………………………….. 3 I.3 HSV ………………………………………………………………………………. 3 I.4 HSI ………………………………………………………………………………… 4 I.5 HCL ..………………………………………………………………………………. 5 I.6 YUV ……………………………………………………………………………….. 5 I.7 YDbDr ……………………………………………………………………………. 6 I.8 YIQ ………………………………………………………………………………… 6 I.9 YCbCr …………………………………………………………………………….. 7

II. ALGORITMA TRANSFORMASI WARNA ……………………………………………… 8 II.1 KONVERSI HEX TRIPLET KE RGB ……………………………………….. 8 II.1.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……………….. 9 II.1.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 10 II.1.C IMPLEMENTASI DENGAN C# ………………………………… 11 II.1.D IMPLEMENTASI DENGAN JAVA …………………………….. 12

II.2 KONVERSI RGB KE HEX TRIPLET ………………………………………… 13 II.2.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ………….…… 13 II.2.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….…….. 15 II.2.C IMPLEMENTASI DENGAN C# ………………………….…….. 16 II.2.D IMPLEMENTASI DENGAN JAVA ……………………….…….. 17

II.3 TRANSFORMASI RGB KE HSL ……………………………………………. 17 II.3.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ………….….. 20 II.3.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….……. 21 II.3.C IMPLEMENTASI DENGAN C# …………………………….….. 22 II.3.D IMPLEMENTASI DENGAN JAVA ……………………….……. 23

II.4 TRANSFORMASI HSL KE RGB …………………………………………….. 24 II.4.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ………….….. 25 II.4.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….……. 26 II.4.C IMPLEMENTASI DENGAN C# ………………………….…….. 27 II.4.D IMPLEMENTASI DENGAN JAVA …………………….………. 28

ii

II.5 TRANSFORMASI RGB KE HSV …………………………………….……… 30 II.5.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……….……… 31 II.5.B IMPLEMENTASI DENGAN VISUAL BASIC.NET ……….…. 32 II.5.C IMPLEMENTASI DENGAN C# …………………….………….. 33 II.5.D IMPLEMENTASI DENGAN JAVA …………………….……….. 34

II.6 TRANSFORMASI HSV KE RGB …………………………………….………. 35 II.6.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …….………… 36 II.6.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….…….. 37 II.6.C IMPLEMENTASI DENGAN C# ……………….………………… 38 II.6.D IMPLEMENTASI DENGAN JAVA ………….………………….. 39

II.7 TRANSFORMASI RGB KE HSI …………………………………….……….. 40 II.7.A IMPLEMENTASI DENGAN VISUAL BASIC 6 .………………. 41 II.7.B IMPLEMENTASI DENGAN VISUAL BASIC.NET .…………….. 42 II.7.C IMPLEMENTASI DENGAN C# …………………….…………… 43 II.7.D IMPLEMENTASI DENGAN JAVA …………………….……….. 44

II.8 TRANSFORMASI HSI KE RGB …………………………………….………. 45 II.8.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …………….… 46 II.8.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …….……. 47 II.8.C IMPLEMENTASI DENGAN C# ……………………….………… 48 II.8.D IMPLEMENTASI DENGAN JAVA ……………….…………….. 49

II.9 TRANSFORMASI RGB KE HCL ……………………………………………… 50 II.9.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ….…………… 52 II.9.B IMPLEMENTASI DENGAN VISUAL BASIC.NET ….………. 53 II.9.C IMPLEMENTASI DENGAN C# ……………………….………… 54 II.9.D IMPLEMENTASI DENGAN JAVA ……………………….…….. 55

II.10 TRANSFORMASI HCL KE RGB .…………………………………………….. 55 II.10.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……………… 58 II.10.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 59 II.10.C IMPLEMENTASI DENGAN C# …………………………………. 60 II.10.D IMPLEMENTASI DENGAN JAVA ……………………………… 61

II.11 TRANSFORMASI RGB KE YUV DAN YUV KE RGB …………………… 63 II.11.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …..………….. 64 II.11.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 64 II.11.C IMPLEMENTASI DENGAN C# …………………………………. 65 II.11.D IMPLEMENTASI DENGAN JAVA ……………………………… 66

II.12 TRANSFORMASI RGB KE YDbDr DAN YDbDr KE RGB ………….. 67 II.12.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……………… 68 II.12.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 69 II.12.C IMPLEMENTASI DENGAN C# …………………………………. 70 II.12.D IMPLEMENTASI DENGAN JAVA ……………………………… 71

iii

II.13 TRANSFORMASI RGB KE YIQ DAN YIQ KE RGB …………..……….. 72 II.13.A IMPLEMENTASI DENGAN VISUAL BASIC 6 …….………… 72 II.13.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 73 II.13.C IMPLEMENTASI DENGAN C# …………………………………. 74 II.13.D IMPLEMENTASI DENGAN JAVA ……………………………… 75

II.14 TRANSFORMASI RGB KE YCbCr DAN YCbCr KE RGB …………..… 76 II.14.A IMPLEMENTASI DENGAN VISUAL BASIC 6 ……….……… 77 II.14.B IMPLEMENTASI DENGAN VISUAL BASIC.NET …………… 77 II.14.C IMPLEMENTASI DENGAN C# …………………………………. 78 II.14.D IMPLEMENTASI DENGAN JAVA ……………………………… 79

DAFTAR PUSTAKA ………………………………………………………………………… 81

LAMPIRAN A – MEMBACA RGB DARI CITRA ……………………………………….. 82

LAMPIRAN B – TAMPILAN PROJECT TRANSFORMASI RUANG WARNA ………. 85

iv

I. RUANG WARNA PADA CITRA

Warna pada dasarnya merupakan hasil persepsi dari cahaya dalam spektrum wilayah yang terlihat oleh retina mata, dan memiliki panjang gelombang antara 400nm sampai dengan 700nm (Poynton , 1997).

Ruang warna atau yang sering juga disebut sebagai model warna merupakan sebuah cara atau metode untuk mengatur, membuat dan memvisualisasikan warna (Ford and Roberts, 1998). Untuk aplikasi yang berbeda ruang warna yang dipakai bisa juga berbeda, hal ini dikarenakan beberapa peralatan tertentu memang membatasi secara ketat ukuran dan jenis ruang warna yang dapat digunakan. Ruang warna biasa digunakan untuk menganalisis citra. Beberapa ruang warna tersebut antara lain adalah sebagai berikut : • RGB(Red Green Blue) • HSL (Hue Saturation Lightness), HSV (Hue Saturation Value), HSI (Hue Saturation Intensity), dan HCL (Hue Chroma Lightness) • YUV, YDbDr, YIQ dan YCbCr (Luminance – )

I.1 RGB (Red Green Blue)

RGB sering digunakan didalam sebagian besar aplikasi komputer karena dengan ruang warna ini, tidak diperlukan transformasi untuk menampilkan informasi di layar monitor. Alasan diatas juga menyebabkan RGB banyak dimanfaatkan sebagai ruang warna dasar bagi sebagian besar aplikasi.

Model warna RGB adalah model warna berdasarkan konsep penambahan kuat cahaya primer yaitu Red, Green dan Blue. Dalam suatu ruang yang sama sekali tidak ada cahaya, maka ruangan tersebut adalah gelap total. Tidak ada signal gelombang cahaya yang diserap oleh mata kita atau RGB (0,0,0). Apabila ditambahkan cahaya merah pada ruangan tersebut, maka ruangan akan berubah warna menjadi merah misalnya RGB (255,0,0), semua benda dalam ruangan tersebut hanya dapat terlihat berwarna merah. Demikian juga apabila cahaya diganti dengan hijau atau biru.

Warna RGB (Sumber http://en.wikipedia.org/wiki/RGB_color_model)

1

Apabila diberikan 2 macam cahaya primer dalam ruangan tersebut seperti (merah dan hijau), atau (merah dan biru) atau (hijau dan biru), maka ruangan akan berubah warna masing-masing menjadi kuning, atau magenta atau cyan. Warna-warna yang dibentuk oleh kombinasi dua macam cahaya tersebut disebut warna sekunder. Warna Tersier adalah warna yang hanya dapat terlihat apabila ada tiga cahaya primer, jadi apabila dinon-aktifkan salah satu cahaya, maka benda tersebut berubah warna. Contoh warna tersier seperti abu-abu,putih.

Pada perhitungan dalam program-program komputer model warna direpresentasi dengan nilai komponennya, seperti dalam RGB (r, g, b) masing-masing nilai antara 0 hingga 255 sesuai dengan urusan masing-masing yaitu pertama Red, kedua Green dan ketigha adalah nilai Blue dengan demikian masing-masing komponen ada 256 tingkat. Apabila dikombinasikan maka ada 256 x 256 x 256 atau 16.777.216 kombinasi warna RGB yang dapat dibentuk.

kuning hijau cyan (255,255,0) (0,255,0) (0,255,255)

• (0, 0, 0) : hitam • (255, 255, 255) : putih • (255, 0, 0) : merah • (0, 255, 0) : hijau merah biru • (0, 0, 255) : biru (255,0,0) (0,0,255) • (255, 255, 0) : kuning • (0, 255, 255) : cyan • (255, 0, 255) : magenta

merah magenta (255,0,0) (255,0,255)

Konfigurasi Warna RGB (Sumber http://en.wikipedia.org/wiki/RGB_color_model)

Dalam mendesign web warna RGB kerapkali direpresentasikan dengan Hex Triplet atau kombinasi 2 pasang bilangan hexadecimal, seperti #FF5D25 artinya Red = FF atau 15*16 + 15 = 255, Green = 5D atau 5*16 + 13 = 93 dan Blue = 25 atau 2*16 + 5 = 37. Jadi RGB (255,93,37)

2

I.2 HSL

Mode HSL merupakan mode yang ditemukan oleh Alvy Ray Smith pada tahun 1978. Mode ini merepresentasikan warna dalam tiga komponen: hue, saturation, dan lightness. Secara konseptual HSL berbentuk kerucut berganda atau lingkaran dengan pucuknya berwarna putih, sudut dasarnya berwarna hitam, dan warna-warni sangat pekat pada sekeliling sisi lingkar horizontal serta pada bagian tengah warna abu-abu sedang .

Ruang Warna HSL (Sumber : http://en.wikipedia.org/wiki/HSL_and_HSV)

Pengertian Hue merupakan karakteristik warna berdasar cahaya yang dipantulkan oleh objek, dalam warna dilihat dari ukurannya mengikuti tingkatan 0 sampai 359. Sebagai contoh, pada tingkat 0 adalah warna Merah, 60 adalah warna Kuning, untuk warna Hijau pada tingkatan 120, sedangkan pada 180 adalah warna Cyan. Untuk tingkat 240 merupakan warna Biru, serta 300 adalah warna Magenta.

Saturation/Chroma adalah tingkatan warna berdasarkan ketajamannya berfungsi untuk mendefinisikan warna suatu objek cenderung murni atau cenderung kotor (gray). Saturation mengikuti persentase yang berkisar dari 0% sampai 100% sebagai warna paling tajam.

Lightness adalah tingkatan warna berdasarkan pencampuran dengan unsur warna Putih sebagai unsur warna yang memunculkan kesan warna terang atau gelap. Nilai koreksi warna pada Lightness berkisar antara 0 untuk warna paling gelap dan 100 untuk warna paling terang.

I.3 HSV

Model warna HSV mendefinisikan warna dalam terminologi Hue, Saturation dan Value. Hue menyatakan warna sebenarnya, seperti merah, violet, dan kuning. Hue digunakan untuk membedakan warna-warna dan menentukan kemerahan (redness), kehijauan (greeness), dsb, dari cahaya. Hue berasosiasi dengan panjang gelombang cahaya. Saturation menyatakan tingkat kemurnian suatu warna, yaitu mengindikasikan seberapa banyak warna putih diberikan pada warna. Value adalah

3 atribut yang menyatakan banyaknya cahaya yang diterima oleh mata tanpa memperdulikan warna

Ruang Warna HSV (Sumber : http://en.wikipedia.org/wiki/HSL_and_HSV)

I.4 HSI

Model warna HSI mendefinisikan warna dalam terminologi Hue, Saturation dan Intensity. Hue menyatakan warna sebenarnya, seperti merah, violet, dan kuning. Hue digunakan untuk membedakan warna-warna dan menentukan kemerahan (redness), kehijauan (greeness), dsb, dari cahaya. Hue berasosiasi dengan panjang gelombang cahaya. Saturation menyatakan tingkat kemurnian suatu warna, yaitu mengindikasikan seberapa banyak warna putih diberikan pada warna. Intensity adalah atribut yang menyatakan banyaknya cahaya yang diterima oleh mata tanpa memperdulikan warna.

Ruang Warna HSI (Sumber : http://en.wikipedia.org/wiki/HSL_and_HSV)

4

I.5 HCL

Ruang warna HCL(Hue, Chroma, Luminance) telah dikembangkan dengan mempertahankan kelebihan yang ada pada ruang warna HSL dan HSV serta menutupi kekurangan yang ada pada keduanya.

Dengan demikian ruang warna ini menjadi lebih optimal untuk kebutuhan analisis informasi warna dalam citra. Madenda dan Missaoui dalam papernya [2005] telah membuktikan bahwa, ruang warna HCL memiliki keunggulan yang cukup signifikan dibandingkan dengan ruang warna lainnya.

Kelebihan dari ruang warna ini diantaranya adalah componen H (warna) memiliki nilai yang konstan sekalipun terjadi perubahan intensitas cahaya maupun chroma pada objek.

(a) (b)

Gambar. 2. a) Model ruang warna HCL. b) Representasi variasi chroma C dan luminance L untuk 6 warna. [Madenda dan Missaoui, 2005]

I.5 YUV (PAL)

YUV adalah ruang warna yang biasanya digunakan sebagai bagian dari kompresi image. YUV mengurangi komponen chrominance sehingga memperkecil bandwidth data image namun tidak terlalu berpengaruh dalam penglihatan manusia.

Dalam YUV komponen krominansi (U dan V) dengan jelas terpisah dari komponen luminansinya (Y) sehingga memudahkan dalam mensegmentasi image. ruang warna ini biasanya digunakan dalam kebanyakan standar coding citra dan .

5

Ruang Warna YUV (Sumber : http://en.wikipedia.org/wiki/YUV)

I.6 YDbDr

YdbDr adalah alternatif lain dari YUV, ruang warna ini digunakan di Perancis dan beberapa negara timur lainnya.

YdbDr terdiri dari komponen - Y, Db and Dr. Y adalah luminance, dan Db, Dr adalah chrominance (perbedaan antara warna merah dan biru).

I.7 YIQ

YIQ adalah ruang warna yang digunakan oleh TV berwarna NTSC, digunakan sebagian besar di Amerika Utara dan Tengah dan Jepang. Komponen Y menunjukkan , dan komponen ini adalah satu-satunya komponen yang digunakan oleh penerima televisi hitam-putih. I berarti in-phase, Q berarti quadrature, mengacu kepada komponen quadrature amplitudo.

Ruang warna YIQ dimaksudkan untuk mengambil kelebihan dari karakteristik response penglihatan manusia. Mata manusia lebih sensitif ke perubahan kuning- biru (I) daripada ke ungu-hijau (Q).

Ruang Warna YIQ(Sumber : http://en.wikipedia.org/wiki/YIQ)

6

I.8 YCbCr

YCbCr merupakan standar internasional bagi pengkodean digital gambar televisi yang didefinisikan di CCIR Recommendation 601 (Ford dan Roberts, 1998).

Y merupakan komponen luminance, Cb dan Cr adalah komponen chrominance. Pada monitor monokrom nilai luminance digunakan untuk merepresentasikan warna RGB, secara psikologis ia mewakili intensitas sebuah warna RGB yang diterima oleh mata. Chrominance merepresentasikan corak warna dan saturasi (saturation). Nilai komponen ini juga mengindikasikan banyaknya komponen warna biru dan merah pada warna (Cuturicu, 1999).

Retina mata mempunyai dua macam sel yang berfungsi sebagai analis visual, yaitu : Sel yang digunakan untuk penglihatan di waktu malam dan sel yang dipakai untuk penglihatan di siang hari. Jenis yang pertama hanya menerima corak keabuan mulai dari warna putih terang sampai dengan hitam pekat. Dan jenis kedua menerima corak warna. Jika sebuah warna RGB diberikan, sel jenis yang pertama mendeteksi tingkat keabuan (gray level) yang serupa dengan nilai luminance-nya, sedangkan sel jenis kedua yang bertanggungjawab terhadap penerimaan corak warna, mendeteksi nilai yang sesuai dengan nilai chrominancenya (Cuturicu, 1999).

7

II. ALGORITMA TRANSFORMASI WARNA

II.1 KONVERSI HEX TRIPLET KE RGB

Dalam mendesign web, warna RGB kerapkali direpresentasikan dengan Hex Triplet atau kombinasi 2 pasang bilangan hexadecimal. Hex Triplet pada dasarnya adalah bilangan Hexadesimal, untuk mengkonversi RGB ke Hex Triplet dibutuhkan konversi tabel bilangan Hexadesimal ke bilangan desimal seperti tabel dibawah.

HEXADESIMAL DESIMAL HEXADESIMAL DESIMAL 0 0 8 8 1 1 9 9 2 2 A 10 3 3 B 11 4 4 C 12 5 5 D 13 6 6 E 14 7 7 F 15

Jadi bila terdapat Hex Triplet #411BEA, bilangan ini dipecah menjadi 41 untuk Red dan 1B untuk Green dan EA untuk Blue, sehingga :

• Bilangan 41, untuk karakter yang pertama adalah 4 hexadesimal dan menurut tabel diatas 4 hexadesimal adalah 4 desimal, maka 4 x 16 =64, sedangkan untuk karakter yang kedua yaitu 1 dan menurut tabel diatas 1 hexadesimal adalah 1 desimal, maka 64 + 1 = 65, jadi konversi 41 ke RGB (Red) adalah 65.

• Bilangan 1B, untuk karakter yang pertama adalah 1 hexadesimal dan menurut tabel diatas 1 hexadesimal adalah 1 desimal, maka 1 x 16 =16, sedangkan untuk karakter yang kedua yaitu B dan menurut tabel diatas B hexadesimal adalah 11 desimal, maka 16 + 11 = 27 jadi konversi 1B ke RGB (Green) adalah 27.

• Bilangan EA, untuk karakter yang pertama adalah E hexadesimal dan menurut tabel diatas E hexadesimal adalah 14 desimal, maka 14 x 16 = 224, sedangkan untuk karakter yang kedua yaitu A dan menurut tabel diatas A hexadesimal adalah 10 desimal, maka 224 + 10 = 234, jadi konversi EA ke RGB (Blue) adalah 234.

Jadi konversi dari Hex Triplet #411BEA ke RGB adalah 65, 27, 234.

8

Berdasarkan langkah-langkah konversi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.1.A VISUAL BASIC 6

0 Private Function Konversi_HexTriplet_RGB(HEXTRIPLET As String) As String 1 Dim strData As String 2 Dim strRet As String 3 4 strData = Replace(HEXTRIPLET, "#", "") 5 strData = UCase$(strData) 6 If Len(strData) >= 6 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 9 strRed = CStr(Hex_Des(Mid$(strData, 1, 1)) * 16 + _ 10 Hex_Des(Mid$(strData, 2, 1))) 11 12 strGreen = CStr(Hex_Des(Mid$(strData, 3, 1)) * 16 + _ 13 Hex_Des(Mid$(strData, 4, 1))) 14 15 strBlue = CStr(Hex_Des(Mid$(strData, 5, 1)) * 16 + _ 16 Hex_Des(Mid$(strData, 6, 1))) 17 18 strRet = strRed + "," + strGreen + "," + strBlue 19 End If 20 21 Konversi_HexTriplet_RGB = strRet 22 End Function

Untuk mengkonversi Hexadesimal ke desimal dibutuhkan function berikut :

0 Private Function Hex_Des(HEXA As String) As Integer 1 Dim iRet As Integer 2 Select Case HEXA 3 Case "A" 4 iRet = 10 5 Case "B" 6 iRet = 11 7 Case "C" 8 iRet = 12 9 Case "D" 10 iRet = 13 11 Case "E" 12 iRet = 14 13 Case "F" 14 iRet = 15 15 Case Else 16 If IsNumeric(HEXA) Then iRet = CInt(HEXA) 17 End Select 18 19 Hex_Des = iRet 20 End Function

9

II.1.B VISUAL BASIC.NET

0 Private Function Konversi_HexTriplet_RGB(ByVal HEXTRIPLET As String) As String 1 Dim strData As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = HEXTRIPLET.Replace("#", "").ToUpper() 6 If strData.Length >= 6 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 9 strRed = CStr(Hex_Des(strData.Substring(0, 1)) * 16 + _ 10 Hex_Des(strData.Substring(1, 1))) 11 12 strGreen = CStr(Hex_Des(strData.Substring(2, 1)) * 16 + _ 13 Hex_Des(strData.Substring(3, 1))) 14 15 strBlue = CStr(Hex_Des(strData.Substring(4, 1)) * 16 + _ 16 Hex_Des(strData.Substring(5, 1))) 17 18 strRet = strRed + "," + strGreen + "," + strBlue 19 End If 20 21 Return strRet 22 End Function

Untuk mengkonversi Hexadesimal ke desimal dibutuhkan function berikut :

0 Private Function Hex_Des(ByVal HEXA As String) As Integer 1 Dim iRet As Integer 2 3 iRet = 0 4 Select Case HEXA 5 Case "A" 6 iRet = 10 7 Case "B" 8 iRet = 11 9 Case "C" 10 iRet = 12 11 Case "D" 12 iRet = 13 13 Case "E" 14 iRet = 14 15 Case "F" 16 iRet = 15 17 Case Else 18 If IsNumeric(HEXA) Then iRet = CInt(HEXA) 19 End Select 20 21 Return iRet 22 End Function

10

II.1.C C#

0 private string Konversi_HexTriplet_RGB(string HEXTRIPLET) 1 { 2 string strData; 3 string strRet; 4 5 strData=HEXTRIPLET.Replace("#","").ToUpper(); 6 strRet = ""; 7 8 if (strData.Length >= 6) 9 { 10 string strRed, strGreen, strBlue; 11 12 strRed = Convert.ToString(Hex_Des(strData.Substring(0, 1)) * 16 + 13 Hex_Des(strData.Substring(1, 1))); 14 strGreen = Convert.ToString(Hex_Des(strData.Substring(2, 1)) * 16 + 15 Hex_Des(strData.Substring(3, 1))); 16 strBlue = Convert.ToString(Hex_Des(strData.Substring(4, 1)) * 16 + 17 Hex_Des(strData.Substring(5, 1))); 18 19 strRet = strRed + "," + strGreen + "," + strBlue; 20 } 21 return strRet; 22 }

Method konversi dari Hexadesimal ke desimal dalam C# :

0 private int Hex_Des(string HEXA) 1 { 2 int iRet = 0; 3 4 if (HEXA == "A") 5 iRet = 10; 6 else if (HEXA == "B") 7 iRet = 11; 8 else if (HEXA == "C") 9 iRet = 12; 10 else if (HEXA == "D") 11 iRet = 13; 12 else if (HEXA == "E") 13 iRet = 14; 14 else if (HEXA == "F") 15 iRet = 15; 16 else 17 { 18 try { 19 iRet = Convert.ToInt32(HEXA); 20 } 21 catch (Exception) { } 22 } 23 24 return iRet; 25 }

11

II.1.D JAVA

0 private String Konversi_HexTriplet_RGB(String HEXTRIPLET) 1 { 2 String strData; 3 String strRet; 5 strData=HEXTRIPLET; 6 strRet = ""; 8 if (strData.length() >= 6) 9 { 10 int strRed, strGreen, strBlue; 11 12 strRed = Hex_Des(strData.substring(0, 1)) * 16 + 13 Hex_Des(strData.substring(1, 2)); 14 strGreen = Hex_Des(strData.substring(2, 3)) * 16 + 15 Hex_Des(strData.substring(3, 4)); 16 strBlue = Hex_Des(strData.substring(4, 5)) * 16 + 17 Hex_Des(strData.substring(5)); 18 19 strRet = String.valueOf(strRed) + "," + String.valueOf(strGreen) + 20 "," + String.valueOf(strBlue); 21 } 22 return strRet; 23 }

Method konversi dari Hexadesimal ke desimal dalam Java :

0 private int Hex_Des(String HEXA) 1 { 2 int iRet = 0; 3 4 if (HEXA.equals("A")) 5 iRet = 10; 6 else if (HEXA.equals("B")) 7 iRet = 11; 8 else if (HEXA.equals("C")) 9 iRet = 12; 10 else if (HEXA.equals("D")) 11 iRet = 13; 12 else if (HEXA.equals("E")) 13 iRet = 14; 14 else if (HEXA.equals("F")) 15 iRet = 15; 16 else 17 { 18 try 19 { 20 iRet = Integer.parseInt(HEXA); 21 } 22 catch(Exception ex) {} 23 } 24 25 return iRet; 26 }

12

Function/Method Konversi_HexTriplet_RGB (dalam bahasa pemrograman VB, VB.NET, C# dan Java) diatas menerima parameter data HexTriplet berupa string, contoh parameter yang dikirimkan adalah 411BEA, dan function ini akan mengembalikan nilai RGB yang bertipe string dan dipisahkan dengan koma, contoh output adalah 65,27,234.

II.2 RGB KE HEX TRIPLET

Untuk menkonversi RGB ke Hex Triplet, misal RGB(65, 27, 234) maka langkahnya adalah :

• 65 / 16 = 4.06, bilangan 4 dikonversikan menurut tabel konversi hexadesimal diatas adalah 4, dan sisa pembagiannya adalah 1 dikonversikan menurut tabel konversi hexadesimal adalah 1 maka Hex Triplet untuk RGB (Red) 65 adalah 41.

• 27 / 16 = 1.68, bilangan 1 dikonversikan menurut tabel konversi hexadesimal diatas adalah 1, dan sisa pembagiannya adalah 11 dikonversikan menurut tabel konversi hexadesimal adalah B maka Hex Triplet untuk RGB (Green) 27 adalah 1B.

• 234 / 16 = 14.625, bilangan 14 dikonversikan menurut tabel konversi hexadesimal diatas adalah E, dan sisa pembagiannya adalah 10 dikonversikan menurut tabel konversi hexadesimal adalah A maka Hex Triplet untuk RGB (Blue) 234 adalah EA.

Jadi konversi dari RGB(65, 27, 234) ke Hex Triplet adalah 411BEA.

Berdasarkan langkah-langkah konversi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.2.A VISUAL BASIC 6

0 Private Function Konversi_RGB_HexTriplet(RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = Split(RGB, ",") 6 If UBound(strData) >= 2 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 Dim iRed1 As Single 9 Dim iRed2 As Single 10 11 iRed1 = Fix(CSng(strData(0)) / 16) 12 iRed2 = Fix(CSng(strData(0)) Mod 16)

13

13 strRed = Des_Hex(CStr(iRed1)) + _ 14 Des_Hex(CStr(iRed2)) 15 Dim iGreen1 As Single 16 Dim iGreen2 As Single 17 18 iGreen1 = Fix(CSng(strData(1)) / 16) 19 iGreen2 = Fix(CSng(strData(1)) Mod 16) 20 strGreen = Des_Hex(CStr(iGreen1)) + _ 21 Des_Hex(CStr(iGreen2)) 22 23 Dim iBlue1 As Single 24 Dim iBlue2 As Single 25 26 iBlue1 = Fix(CSng(strData(2)) / 16) 27 iBlue2 = Fix(CSng(strData(2)) Mod 16) 28 strBlue = Des_Hex(CStr(iBlue1)) + _ 29 Des_Hex(CStr(iBlue2)) 30 31 strRet = strRed + strGreen + strBlue 32 End If 33 34 Konversi_RGB_HexTriplet = strRet 35 End Function

Function konversi dari Hexadesimal ke desimal dalam VB :

0 Private Function Des_Hex(DESIMAL As Single) As String 1 Dim strRet As String 2 3 strRet = DESIMAL 4 Select Case DESIMAL 5 Case 10 6 strRet = "A" 7 Case 11 8 strRet = "B" 9 Case 12 10 strRet = "C" 11 Case 13 12 strRet = "D" 13 Case 14 14 strRet = "E" 15 Case 15 16 strRet = "F" 17 End Select 18 19 Des_Hex = strRet 20 End Function

14

II.2.B VISUAL BASIC.NET

0 Private Function Konversi_RGB_HexTriplet(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = RGB.Split(",") 6 If strData.Length >= 3 Then 7 Dim strRed As String, strGreen As String, strBlue As String 8 9 Dim iRed1 As Single 10 Dim iRed2 As Single 11 12 iRed1 = Fix(CSng(strData(0)) / 16) 13 iRed2 = Fix(CSng(strData(0)) Mod 16) 14 strRed = Des_Hex(iRed1) + Des_Hex(iRed2) 15 16 Dim iGreen1 As Single 17 Dim iGreen2 As Single 18 19 iGreen1 = Fix(CSng(strData(1)) / 16) 20 iGreen2 = Fix(CSng(strData(1)) Mod 16) 21 strGreen = Des_Hex(iGreen1) + Des_Hex(iGreen2) 22 23 Dim iBlue1 As Single 24 Dim iBlue2 As Single 25 26 iBlue1 = Fix(CSng(strData(2)) / 16) 27 iBlue2 = Fix(CSng(strData(2)) Mod 16) 28 strBlue = Des_Hex(iBlue1) + Des_Hex(iBlue2) 29 30 strRet = strRed + strGreen + strBlue 31 End If 32 Return strRet 33 End Function

Function konversi dari Hexadesimal ke desimal dalam VB.NET :

0 Private Function Des_Hex(ByVal DESIMAL As Single) As String 1 Dim strRet As String 2 3 strRet = DESIMAL 4 Select Case DESIMAL 5 Case 10 6 strRet = "A" 7 Case 11 8 strRet = "B" 9 Case 12 10 strRet = "C" 11 Case 13 12 strRet = "D" 13 Case 14 14 strRet = "E"

15

15 Case 15 16 strRet = "F" 17 End Select 18 Return strRet 19 End Function

II.2.C C#

0 private string Konversi_RGB_HexTriplet(string RGB) 1 { 2 string[] strData; 3 string strRet; 4 5 strData = RGB.Split(','); 6 strRet = ""; 7 8 if (strData.Length >= 3) 9 { 10 string strRed, strGreen, strBlue; 11 double iRed1, iRed2; 12 iRed1 = Math.Truncate(Convert.ToDouble(strData[0]) / 16); 13 iRed2 = Math.Truncate(Convert.ToDouble(strData[0]) % 16); 14 strRed = Des_Hex(iRed1) + Des_Hex(iRed2); 15 16 double iGreen1, iGreen2; 17 iGreen1 = Math.Truncate(Convert.ToDouble(strData[1]) / 16); 18 iGreen2 = Math.Truncate(Convert.ToDouble(strData[1]) % 16); 19 strGreen = Des_Hex(iGreen1) + Des_Hex(iGreen2); 20 21 double iBlue1, iBlue2; 22 iBlue1 = Math.Truncate(Convert.ToDouble(strData[2]) / 16); 23 iBlue2 = Math.Truncate(Convert.ToDouble(strData[2]) % 16); 24 strBlue = Des_Hex(iBlue1) + Des_Hex(iBlue2); 25 26 strRet = strRed + strGreen + strBlue; 27 } 28 return strRet; 29 }

Method konversi dari Hexadesimal ke desimal dalam C# :

0 private string Des_Hex(double DESIMAL) 1 { 2 string strRet = DESIMAL.ToString(); 3 4 if (DESIMAL == 10) 5 strRet = "A"; 6 else if (DESIMAL == 11) 7 strRet = "B"; 8 else if (DESIMAL == 12) 9 strRet = "C"; 10 else if (DESIMAL == 13)

16

11 strRet = "D"; 12 else if (DESIMAL == 14) 13 strRet = "E"; 14 else if (DESIMAL == 15) 15 strRet = "F"; 16 17 return strRet; 18 }

II.2.D JAVA

0 private String Konversi_RGB_HexTriplet(String RGB) 1 { 2 String[] strData; 3 String strRet; 4 5 strData = RGB.split(","); 6 strRet = ""; 7 8 if (strData.length >= 2) 9 { 10 String strRed, strGreen, strBlue; 11 double iRed1, iRed2; 12 iRed1 = Double.parseDouble(strData[0]) / 16; 13 iRed2 = Double.parseDouble(strData[0]) % 16; 14 strRed = Des_Hex((int)iRed1) + Des_Hex((int)iRed2); 15 16 double iGreen1, iGreen2; 17 iGreen1 = Double.parseDouble(strData[1]) / 16; 18 iGreen2 = Double.parseDouble(strData[1]) % 16; 19 strGreen = Des_Hex((int)iGreen1) + Des_Hex((int)iGreen2); 20 21 double iBlue1, iBlue2; 22 iBlue1 = Double.parseDouble(strData[2]) / 16; 23 iBlue2 = Double.parseDouble(strData[2]) % 16; 24 strBlue = Des_Hex((int)iBlue1) + Des_Hex((int)iBlue2); 25 26 strRet = strRed + strGreen + strBlue; 27 } 28 return strRet; 29 }

Method konversi dari Hexadesimal ke desimal dalam Java :

0 private String Des_Hex(int DESIMAL) 1 { 2 String strRet = Integer.toString(DESIMAL); 3 4 if (DESIMAL == 10) 5 strRet = "A"; 6 else if (DESIMAL == 11) 7 strRet = "B";

17

8 else if (DESIMAL == 12) 9 strRet = "C"; 10 else if (DESIMAL == 13) 11 strRet = "D"; 12 else if (DESIMAL == 14) 13 strRet = "E"; 14 else if (DESIMAL == 15) 15 strRet = "F"; 16 17 return strRet; 18 }

RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method Konversi_RGB_HexTriplet diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method Konversi_RGB_HexTriplet diatas adalah 65,27,234. Output dari function ini akan berupa data HexTriplet bertipe string, contoh : 411BEA.

II.3 TRANSFORMASI RGB KE HSL

Untuk mentransformasi nilai dari RGB ke HSL diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB. Nilai max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh sudut hue[0,3600] yang tepat untuk ruang warna HSL menggunakan rumus seperti berikut (http://en.wikipedia.org/wiki/HSL_and_HSV) :

0, max 60 6 , max max 60 2 , max max 60 4 , max max

Untuk mendapatkan saturation dan lightness (kecerahan cahaya) yang tepat pada HSL, dengan koordinat s, l [0,1] menggunakan rumus seperti berikut :

1 max min 2

18

0 , max max , 0.5 2 max , 0.5 22L

Rumus di atas menghasilkan nilai lightness dan saturation dalam jangkauan [0,1]. Kalikan dengan 255 untuk memperoleh nilai dengan jangkauan [0,255].

Transformasi RGB ke HSL/HSI/HSV/HCL dan sebaliknya menghasilkan bilangan real, sementara media bitmap bekerja pada bilangan integer diskrit, karena itu perlu dilakukan pembulatan. Jumlah kemungkinan mode RGB ada 256x256x256 = 16.777.216 warna, sedangkan mode HSL/HSI/HSV/HCL ada 360x100x100 = 3.600.000 warna. Jadi akan ada warna-warna yang jika ditransformasikan hasilnya tidak akan sama akibat pembulatan.

Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HSL, maka langkahnya adalah sebagai berikut :

Setiap nilai RGB(65, 27, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi , , = 0.255, 0.106, 0.918

RGB(0.255, 0.104, 0.918) ini yang akan ditransformasikan ke bentuk HSL. max = nilai B (blue) = 0.918, min = nilai G (green) = 0.106, max – min = 0.918 – 0.106 = 0.812.

h (hue) = 60 4 , karena max = B (blue).

. . = 60 4 = 2510 .

l (lightness) = max min

= 0.918 0.106 = 0.512

s (saturation) = , karena l (lightness) > 0.5 L

. = = 0.832 .

19

sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HSL(2510, 0.832, 0.512) dengan jangkauan RGB [0,1].

Berdasarkan langkah - langkah transformasi diatas, maka untuk meng- implementasikan ke bahasa pemrograman adalah sebagai berikut :

II.3.A VISUAL BASIC 6

0 Private Function RGB_HSL(RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 Dim H As Double 4 Dim S As Double 5 Dim L As Double 6 7 strRet = "" 8 strData = Split(RGB, ",") 9 If UBound(strData) >= 2 Then 10 Dim R As Double, G As Double, B As Double 11 Dim max As Double, min As Double 12 13 R = CDbl(strData(0)) / 255 14 G = CDbl(strData(1)) / 255 15 B = CDbl(strData(2)) / 255 16 max = R 17 If max < G Then max = G 18 If max < B Then max = B 19 min = R 20 If min > G Then min = G 21 If min > B Then min = B 22 23 If max = min Then 24 H = 0 25 ElseIf max = R Then 26 H = 60 * (((G - B) / (max - min)) Mod 6) 27 ElseIf max = G Then 28 H = 60 * (((B - R) / (max - min)) + 2) 29 ElseIf max = B Then 30 H = 60 * (((R - G) / (max - min)) + 4) 31 End If 32 33 L = 0.5 * (max + min) 34 35 If max = min Then S = 0 36 If L <= 0.5 Then 37 S = (max - min) / (2 * L) 38 ElseIf L > 0.5 Then 39 S = (max - min) / (2 - (2 * L)) 40 End If 41 End If 42 RGB_HSL = Format$(H, "0.000") + "," + Format$(S, "0.000") + "," + Format$(L, "0.000") 43 End Function

20

II.3.B VISUAL BASIC.NET

0 Private Function RGB_HSL(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = RGB.Split(",") 6 If strData.Length() >= 3 Then 7 Dim R As Double, G As Double, B As Double 8 Dim H As Double 9 Dim S As Double 10 Dim L As Double 11 Dim max As Double 12 Dim min As Double 13 14 R = CDbl(strData(0)) / 255 15 G = CDbl(strData(1)) / 255 16 B = CDbl(strData(2)) / 255 17 max = R 18 If max < G Then max = G 19 If max < B Then max = B 20 21 min = R 22 If min > G Then min = G 23 If min > B Then min = B 24 25 If max = min Then 26 H = 0 27 ElseIf max = R Then 28 H = 60 * (((G - B) / (max - min)) Mod 6) 29 ElseIf max = G Then 30 H = 60 * (((B - R) / (max - min)) + 2) 31 ElseIf max = B Then 32 H = 60 * (((R - G) / (max - min)) + 4) 33 End If 34 35 L = 0.5 * (max + min) 36 37 If max = min Then S = 0 38 39 If L <= 0.5 Then 40 S = (max - min) / (2 * L) 41 ElseIf L > 0.5 Then 42 S = (max - min) / (2 - (2 * L)) 43 End If 44 45 strRet = H.ToString("0.000") + "," + S.ToString("0.000") + "," + L.ToString("0.000") 46 End If 47 48 Return strRet 49 End Function

21

II.3.C C#

0 private string RGB_HSL(string RGB) 1 { 2 string[] strData; 3 string strRet = ""; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double H = 0; 10 double S = 0; 11 double L = 0; 12 double max; 13 double min; 14 15 R = double.Parse(strData[0]) / 255; 16 G = double.Parse(strData[1]) / 255; 17 B = double.Parse(strData[2]) / 255; 18 max = R; 19 if (max < G) max = G; 20 if (max < B) max = B; 21 22 min = R; 23 if (min > G) min = G; 24 if (min > B) min = B; 25 26 if (max == min) 27 H = 0; 28 else if (max == R) 29 H = 60 * (((G - B) / (max - min)) % 6); 30 else if (max == G) 31 H = 60 * (((B - R) / (max - min)) + 2); 32 else if (max == B) 33 H = 60 * (((R - G) / (max - min)) + 4); 34 35 L = 0.5 * (max + min); 36 37 if (max == min) S = 0; 38 39 if (L <= 0.5) 40 S = (max - min) / (2 * L); 41 else if (L > 0.5) 42 S = (max - min) / (2 - (2 * L)); 43 44 strRet = H.ToString("0.000") + "," + S.ToString("0.000") + "," + L.ToString("0.000"); 45 } 46 47 return strRet; 48 }

22

II.3.D JAVA

0 private String RGB_HSL(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 5 strData = RGB.split(","); 6 if (strData.length >= 2) 7 { 8 double R, G, B, , max, min, H = 0, S = 0, double L = 0; 9 10 R = Double.parseDouble(strData[0]) / 255; 11 G = Double.parseDouble(strData[1]) / 255; 12 B = Double.parseDouble(strData[2]) / 255; 13 max = R; 14 if (max < G) max = G; 15 if (max < B) max = B; 16 17 min = R; 18 if (min > G) min = G; 19 if (min > B) min = B; 20 21 if (max == min) 22 H = 0; 23 else if (max == R) 24 H = 60 * (((G - B) / (max - min)) % 6); 25 else if (max == G) 26 H = 60 * (((B - R) / (max - min)) + 2); 27 else if (max == B) 28 H = 60 * (((R - G) / (max - min)) + 4); 29 30 L = 0.5 * (max + min); 31 32 if (max == min) S = 0; 33 34 if (L <= 0.5) 35 S = (max - min) / (2 * L); 36 else if (L > 0.5) 37 S = (max - min) / (2 - (2 * L)); 38 39 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.###"); 40 strRet = df.format(H) + "," + df.format(S) + "," + df.format(L); 41 } 42 43 return strRet; 44 }

RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method RGB_HSL diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method RGB_HSL diatas adalah 65,27,234. Output dari function/method ini akan berupa data HSL bertipe string, contoh : 289.5, 0.833, 0.512.

23

II.4 TRANSFORMASI HSL KE RGB

Untuk transformasi kembali dari HSL ke RGB, gunakan rumus berikut. Dengan hue H [0°, 360°), saturation S [0, 1], dan lightness L [0, 1] : (http://en.wikipedia.org/wiki/HSL_and_HSV)

2 , 22 ,

′ 60

1|′ 2 1|

0, 0, 0 , ′ ,,0 , 0 1 , , 0 , 1 ′ 2 1, 1, 1 0, , , 2 ′ 3 0, , , 3 ′ 4 ′ , 0, , 4 5 ,0,0 , 5 ′ 6

, , 1, 1, 1

Rumus di atas menghasilkan nilai RGB dalam jangkauan [0,1]. Untuk jangkauan [0,255], kalikan dengan 255.

Transformasikan HSL(2510, 0.832, 0.512) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut :

L = 0.512 lebih besar dari 0.5, maka

C = (2 – 2L) x S = (2 – (2 x 0.512)) x 0.832 = 0.812

H’ = H / 600 = 251 / 60 = 4.183

X = C ( 1 – |H’ mod 2 – 1|) = 0.812 (1 - |(4.183 mod 2) - 1|) = 0.812 (1 - 0.187) = 0.812 (0.183) = 0.149

24

(R1, G1, B1) = (X, 0, C), karena H’ = 4.183 ≥ 4 dan H’ < 5 = (0.149, 0, 0.812)

m = L - 0.5(C) = 0.512 - 0.5(0.812) = 0.512 - 0.406 = 0.106

(R, G, B) = (R1 + m, G1 + m, B1 + m) = (0.149 + 0.106, 0 + 0.106, 0.812 + 0.106) = (0.255, 0.106, 0.918)

RGB (0.255, 0.106, 0.918) ini dalam jangkauan [0,1] untuk jangkauan [0,255] kalikan dengan 255 : (0.255 x 255, 0.106 x 255, 0.918 x 255) menjadi (65.025, 27,03, 234.09) bulatkan keatas menjadi (65, 27, 234).

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.4.A VISUAL BASIC 6

0 Private Function HSL_RGB(HSL As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 Dim R As Double, G As Double, B As Double 4 5 strRet = "" 6 strData = Split(HSL, ",") 7 If UBound(strData) >= 2 Then 8 Dim R1 As Double, G1 As Double, B1 As Double 9 Dim H As Double, S As Double, L As Double 10 Dim H1 As Double 11 Dim X As Double 12 Dim C As Double 13 Dim m As Double 14 15 H = CDbl(strData(0)) 16 S = CDbl(strData(1)) 17 L = CDbl(strData(2)) 18 19 If L <= 0.5 Then 20 C = 2 * L * S 21 ElseIf L > 0.5 Then 22 C = (2 - 2 * L) * S 23 End If 24 25 H1 = H / 60 26 27 X = H1 Mod 2 : X = Abs(X - 1) : X = C * (1 - X) 28 29 If H1 >= 0 And H1 < 1 Then 30 R1 = C: G1 = X: B1 = 0 31 ElseIf H1 >= 1 And H1 < 2 Then

25

32 R1 = X: G1 = C: B1 = 0 33 ElseIf H1 >= 2 And H1 < 3 Then 34 R1 = 0: G1 = C: B1 = X 35 ElseIf H1 >= 3 And H1 < 4 Then 36 R1 = 0: G1 = X: B1 = C 37 ElseIf H1 >= 4 And H1 < 5 Then 38 R1 = X: G1 = 0: B1 = C 39 ElseIf H1 >= 5 And H1 < 6 Then 40 R1 = C: G1 = 0: B1 = 0 41 Else 42 R1 = 0: G1 = 0: B1 = 0 43 End If 44 45 m = L - (0.5 * C) 46 47 R = Round((R1 + m) * 255) 48 G = Round((G1 + m) * 255) 49 B = Round((B1 + m) * 255) 50 End If 51 52 HSL_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 53 End Function

II.4.B VISUAL BASIC.NET

0 Private Function HSL_RGB(ByVal HSL As String) As String 1 Dim strData() As String 2 Dim strRet As String 3 4 strRet = "" 5 strData = HSL.Split(",") 6 If strData.Length() >= 3 Then 7 Dim R As Double, G As Double, B As Double 8 Dim R1 As Double, G1 As Double, B1 As Double 9 Dim H As Double, S As Double, L As Double 10 Dim H1 As Double 11 Dim X As Double 12 Dim C As Double 13 Dim m As Double 14 15 H = CDbl(strData(0)) 16 S = CDbl(strData(1)) 17 L = CDbl(strData(2)) 18 19 If L <= 0.5 Then 20 C = 2 * L * S 21 ElseIf L > 0.5 Then 22 C = (2 - 2 * L) * S 23 End If 24 25 H1 = H / 60 26 27 X = Math.Abs((H1 Mod 2) - 1)

26

28 X = C * (1 - X)

29 If H1 >= 0 And H1 < 1 Then 30 R1 = C : G1 = X : B1 = 0 31 ElseIf H1 >= 1 And H1 < 2 Then 32 R1 = X : G1 = C : B1 = 0 33 ElseIf H1 >= 2 And H1 < 3 Then 34 R1 = 0 : G1 = C : B1 = X 35 ElseIf H1 >= 3 And H1 < 4 Then 36 R1 = 0 : G1 = X : B1 = C 37 ElseIf H1 >= 4 And H1 < 5 Then 38 R1 = X : G1 = 0 : B1 = C 39 ElseIf H1 >= 5 And H1 < 6 Then 40 R1 = C : G1 = 0 : B1 = 0 41 Else 42 R1 = 0 : G1 = 0 : B1 = 0 43 End If 44 45 m = L - (0.5 * C) 46 47 R = Math.Round((R1 + m) * 255) 48 G = Math.Round((G1 + m) * 255) 49 B = Math.Round((B1 + m) * 255) 50 51 strRet = R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###") 52 End If 53 54 Return strRet 55 End Function

II.4.C C#

0 private string HSL_RGB(string HSL) 1 { 2 string[] strData; 3 string strRet = ""; 4 5 strData = HSL.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double R1, G1, B1; 10 double H, S, L; 11 double H1, X, C = 0, m; 12 13 H = double.Parse(strData[0]); 14 S = double.Parse(strData[1]); 15 L = double.Parse(strData[2]); 16 17 if (L <= 0.5) 18 C = 2 * L * S; 19 else if (L > 0.5) 20 C = (2 - 2 * L) * S;

27

21 H1 = H / 60; 22 X = Math.Abs((H1 % 2) - 1); 23 X = C * (1 - X); 24 25 if (H1 >= 0 && H1 < 1) 26 { 27 R1 = C; G1 = X; B1 = 0; } 28 else if (H1 >= 1 && H1 < 2) 29 { 30 R1 = X; G1 = C; B1 = 0; } 31 else if (H1 >= 2 && H1 < 3) 32 { 33 R1 = 0; G1 = C; B1 = X; } 34 else if (H1 >= 3 && H1 < 4) 35 { 36 R1 = 0; G1 = X; B1 = C; } 37 else if (H1 >= 4 && H1 < 5) 38 { 39 R1 = X; G1 = 0; B1 = C; } 40 else if (H1 >= 5 && H1 < 6) 41 { 42 R1 = C; G1 = 0; B1 = 0; } 43 else 44 { 45 R1 = 0; G1 = 0; B1 = 0; } 46 47 m = L - (0.5 * C); 48 49 R = Math.Round((R1 + m) * 255); 50 G = Math.Round((G1 + m) * 255); 51 B = Math.Round((B1 + m) * 255); 52 53 strRet = R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 54 } 55 56 return strRet; 57 }

II.4.D JAVA

0 private String HSL_RGB(String HSL) 1 { 2 String[] strData; 3 String strRet; 4 5 strRet = ""; 6 strData = HSL.split(","); 7 8 if (strData.length >= 2) 9 { 10 double R, G, B; 11 double R1, G1, B1; 12 double H, S, L;

28

13 double H1, X, C = 0, m; 14 15 H = Double.parseDouble(strData[0]); 16 S = Double.parseDouble(strData[1]); 17 L = Double.parseDouble(strData[2]); 18 19 if (L <= 0.5) 20 C = 2 * L * S; 21 else if (L > 0.5) 22 C = (2 - 2 * L) * S; 23 24 H1 = H / 60; 25 X = Math.abs((H1 % 2) - 1); 26 X = C * (1 - X); 27 28 if (H1 >= 0 && H1 < 1) 29 { 30 R1 = C; G1 = X; B1 = 0; } 31 else if (H1 >= 1 && H1 < 2) 32 { 33 R1 = X; G1 = C; B1 = 0; } 34 else if (H1 >= 2 && H1 < 3) 35 { 36 R1 = 0; G1 = C; B1 = X; } 37 else if (H1 >= 3 && H1 < 4) 38 { 39 R1 = 0; G1 = X; B1 = C; } 40 else if (H1 >= 4 && H1 < 5) 41 { 42 R1 = X; G1 = 0; B1 = C; } 43 else if (H1 >= 5 && H1 < 6) 44 { 45 R1 = C; G1 = 0; B1 = 0; } 46 else 47 { 48 R1 = 0; G1 = 0; B1 = 0; } 49 50 m = L - (0.5 * C); 51 52 R = Math.round((R1 + m) * 255); 53 G = Math.round((G1 + m) * 255); 54 B = Math.round((B1 + m) * 255); 55 56 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 57 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 58 } 59 return strRet; 60 }

HSL terdiri dari bilangan Hue, Saturation dan Lightness, untuk memasukkan bilangan HSL ke function/method HSL_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HSL_RGB diatas adalah 251, 0.832, 0.512. Output dari function ini akan berupa data RGB bertipe string, contoh : 65,27,234.

29

II.5 TRANSFORMASI RGB KE HSV

Untuk mentransformasi dari RGB ke HSV. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, dengan max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh sudut hue[0,360] yang tepat untuk ruang warna HSV, menggunakan rumus seperti berikut (http://en.wikipedia.org/wiki/HSL_and_HSV) :

0, max 60 6 , max max 60 2 , max max 60 4 , max max

Nilai-nilai untuk s dan v pada HSV didefinisikan sebagai berikut :

0 , max ,

Rumus di atas menghasilkan nilai value dan saturation dalam jangkauan RGB [0,1]. Kalikan dahulu dengan 255 untuk memperoleh nilai dengan jangkauan RGB [0,255].

Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HSV, maka langkahnya adalah sebagai berikut :

Setiap nilai RGB(65, 27, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi , , = 0.255, 0.106, 0.918

RGB(0.255, 0.106, 0.918) ini yang akan ditransformasikan ke bentuk HSV.

30

max = nilai B (blue) = 0.918, min = nilai G (green) = 0.106, max – min = 0.918 – 0.106 = 0.812.

h (Hue) = 60 4 , karena max = B (blue).

. . = 60 4 = 2510 . v (value) = max = 0.918

s (saturation) = , karena max <> min

. = = 0.885 . sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HSV(2510, 0.885, 0.918) dengan jangkauan RGB [0,1].

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.5.A VISUAL BASIC 6

0 Private Function RGB_HSV(RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, V As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double 8 Dim min As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 20 If max = min Then 21 H = 0 22 ElseIf max = R Then 23 H = 60 * (((G - B) / (max - min)) Mod 6) 24 ElseIf max = G Then

31

25 H = 60 * (((B - R) / (max - min)) + 2) 26 ElseIf max = B Then 27 H = 60 * (((R - G) / (max - min)) + 4) 28 End If 29 30 V = max 31 If max = min Then 32 S = 0 33 Else 34 S = (max - min) / V 35 End If 36 End If 37 38 RGB_HSV = Format$(H, "0.000") + "," + Format$(S, "0.000") + "," + Format$(V, "0.000") 39 End Function

II.5.B VISUAL BASIC.NET

0 Private Function RGB_HSV(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, V As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double 8 Dim min As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 17 min = R 18 If min > G Then min = G 19 If min > B Then min = B 20 21 If max = min Then 22 H = 0 23 ElseIf max = R Then 24 H = 60 * (((G - B) / (max - min)) Mod 6) 25 ElseIf max = G Then 26 H = 60 * (((B - R) / (max - min)) + 2) 27 ElseIf max = B Then 28 H = 60 * (((R - G) / (max - min)) + 4) 29 End If 30 31 V = max 32 33 If max = min Then 34 S = 0

32

35 Else 36 S = (max - min) / V 37 End If 38 End If 39 40 RGB_HSV = H.ToString("0.000") + "," + S.ToString("0.000") + "," + V.ToString("0.000") 41 End Function

II.5.C C#

0 private string RGB_HSV(string RGB) 1 { 2 string[] strData; 3 double H = 0, S = 0, V = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double min, max; 10 11 R = double.Parse(strData[0]) / 255; 12 G = double.Parse(strData[1]) / 255; 13 B = double.Parse(strData[2]) / 255; 14 max = R; 15 if (max < G) max = G; 16 if (max < B) max = B; 17 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 if (max == min) 23 H = 0; 24 else if (max == R) 25 H = 60 * (((G - B) / (max - min)) % 6); 26 else if (max == G) 27 H = 60 * (((B - R) / (max - min)) + 2); 28 else if (max == B) 29 H = 60 * (((R - G) / (max - min)) + 4); 30 31 V = max; 32 33 if (max == min) 34 S = 0; 35 else 36 S = (max - min) / V; 37 } 38 39 return H.ToString("0.000") + "," + S.ToString("0.000") + "," + V.ToString("0.000"); 40 }

33

II.5.D JAVA

0 private String RGB_HSV(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double H = 0, S = 0, V = 0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 double min, max; 11 12 R = Double.parseDouble(strData[0]) / 255; 13 G = Double.parseDouble(strData[1]) / 255; 14 B = Double.parseDouble(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 19 min = R; 20 if (min > G) min = G; 21 if (min > B) min = B; 22 23 if (max == min) 24 H = 0; 25 else if (max == R) 26 H = 60 * (((G - B) / (max - min)) % 6); 27 else if (max == G) 28 H = 60 * (((B - R) / (max - min)) + 2); 29 else if (max == B) 30 H = 60 * (((R - G) / (max - min)) + 4); 31 32 V = max; 33 34 if (max == min) 35 S = 0; 36 else 37 S = (max - min) / V; 38 39 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 40 strRet = df.format(H) + "," + df.format(S) + "," + df.format(V); 41 } 42 43 return strRet; 44 }

RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method RGB_HSV diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method RGB_HSV diatas adalah 65,27,234. Output dari function ini akan berupa data HSV bertipe string, contoh : 251, 0.885, 0.918.

34

II.6 TRANSFORMASI HSV KE RGB

Untuk transformasi kembali dari HSV ke RGB, gunakan rumus berikut. Dengan hue H [0°, 360°), saturation S [0, 1], dan value V [0, 1] (http://en.wikipedia.org/wiki/HSL_and_HSV) :

′ 60

1|′ 2 1|

0, 0, 0 , ′ ,,0 , 0 1 , , 0 , 1 ′ 2 1, 1, 1 0, , , 2 ′ 3 0, , , 3 ′ 4 ′ , 0, , 4 5 ,0,0 , 5 ′ 6

, , 1, 1, 1

Rumus di atas menghasilkan nilai RGB dalam jangkauan [0,1]. Untuk jangkauan [0,255], kalikan dahulu dengan 255.

Transformasikan HSV(251, 0.885, 0.918) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut :

C = V x S = 0.918 x 0.885 = 0.812 H’ = H / 60 = 251 / 60 = 4.183 X = C ( 1 – |H’ mod 2 – 1|) = 0.815 (1 - |(4.183 mod 2) - 1|) = 0.815 (1 - | 0.183 – 1|) = 0.149

(R1, G1, B1) = (X, 0, C), karena H’ ≥ 4 dan H’ < 5 = (0.149, 0, 0.812)

m = V - C = 0.918 - 0.812 = 0.106

(R, G, B) = (R1 + m, G1 + m, B1 + m) = (0.149 + 0.106, 0 + 0.106, 0.812 + 0.106) = (0.255, 0.106, 0.918)

35

RGB (0.255, 0.106, 0.918) ini dalam jangkauan [0,1] untuk jangkauan [0,255] kalikan dengan 255 : (0.255 x 255, 0.106 x 255, 0.918 x 255) menjadi (65.025, 27,03, 234.09) bulatkan keatas menjadi (65, 27, 234).

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.6.A VISUAL BASIC 6

0 Private Function HSV_RGB(HSV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(HSV, ",") 5 If UBound(strData) >= 2 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, V As Double 8 Dim H1 As Double, X As Double, C As Double, m As Double 9 10 H = CDbl(strData(0)) 11 S = CDbl(strData(1)) 12 V = CDbl(strData(2)) 13 14 C = V * S 15 H1 = H / 60 16 17 X = H1 Mod 2 18 X = Abs(X - 1) 19 X = C * (1 - X) 20 21 If H1 >= 0 And H1 < 1 Then 22 R1 = C: G1 = X: B1 = 0 23 ElseIf H1 >= 1 And H1 < 2 Then 24 R1 = X: G1 = C: B1 = 0 25 ElseIf H1 >= 2 And H1 < 3 Then 26 R1 = 0: G1 = C: B1 = X 27 ElseIf H1 >= 3 And H1 < 4 Then 28 R1 = 0: G1 = X: B1 = C 29 ElseIf H1 >= 4 And H1 < 5 Then 30 R1 = X: G1 = 0: B1 = C 31 ElseIf H1 >= 5 And H1 < 6 Then 32 R1 = C: G1 = 0: B1 = 0 33 Else 34 R1 = 0: G1 = 0: B1 = 0 35 End If 36 37 m = V - C 38 39 R = Round((R1 + m) * 255) 40 G = Round((G1 + m) * 255) 41 B = Round((B1 + m) * 255) 42 End If

36

43 44 HSV_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 45 End Function

II.6.B VISUAL BASIC.NET

0 Private Function HSV_RGB(ByVal HSV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = HSV.Split(",") 5 If strData.Length >= 3 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, V As Double 8 Dim H1 As Double, X As Double, C As Double, m As Double 9 10 H = CDbl(strData(0)) 11 S = CDbl(strData(1)) 12 V = CDbl(strData(2)) 13 14 C = V * S 15 H1 = H / 60 16 X = Math.Abs((H1 Mod 2) - 1) 17 X = C * (1 - X) 18 19 If H1 >= 0 And H1 < 1 Then 20 R1 = C : G1 = X : B1 = 0 21 ElseIf H1 >= 1 And H1 < 2 Then 22 R1 = X : G1 = C : B1 = 0 23 ElseIf H1 >= 2 And H1 < 3 Then 24 R1 = 0 : G1 = C : B1 = X 25 ElseIf H1 >= 3 And H1 < 4 Then 26 R1 = 0 : G1 = X : B1 = C 27 ElseIf H1 >= 4 And H1 < 5 Then 28 R1 = X : G1 = 0 : B1 = C 29 ElseIf H1 >= 5 And H1 < 6 Then 30 R1 = C : G1 = 0 : B1 = 0 31 Else 32 R1 = 0 : G1 = 0 : B1 = 0 33 End If 34 35 m = V - C

36 R = Math.Round((R1 + m) * 255) 37 G = Math.Round((G1 + m) * 255) 38 B = Math.Round((B1 + m) * 255) 39 End If 40 41 HSV_RGB = R.ToString("###") + "," + G.ToString("###") + _ 42 "," + B.ToString("###") 43 End Function

37

II.6.C C#

0 private string HSV_RGB(string HSV) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = HSV.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R1, G1, B1; 9 double H, S, V; 10 double H1, X, C, m; 11 12 H = double.Parse(strData[0]); 13 S = double.Parse(strData[1]); 14 V = double.Parse(strData[2]); 15 16 C = V * S; 17 18 H1 = H / 60; 19 X = Math.Abs((H1 % 2) - 1); 20 X = C * (1 - X); 21 22 if (H1 >= 0 && H1 < 1) 23 { 24 R1 = C; G1 = X; B1 = 0; } 25 else if (H1 >= 1 && H1 < 2) 26 { 27 R1 = X; G1 = C; B1 = 0; } 28 else if (H1 >= 2 && H1 < 3) 29 { 30 R1 = 0; G1 = C; B1 = X; } 31 else if (H1 >= 3 && H1 < 4) 32 { 33 R1 = 0; G1 = X; B1 = C; } 34 else if (H1 >= 4 && H1 < 5) 35 { 36 R1 = X; G1 = 0; B1 = C; } 37 else if (H1 >= 5 && H1 < 6) 38 { 39 R1 = C; G1 = 0; B1 = 0; } 40 else 41 { 42 R1 = 0; G1 = 0; B1 = 0; } 43 44 m = V - C; 45 46 R = Math.Round((R1 + m) * 255); 47 G = Math.Round((G1 + m) * 255); 48 B = Math.Round((B1 + m) * 255); 49 } 51 return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 53 }

38

II.6.D JAVA

0 private String HSV_RGB(String HSV) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R = 0, G = 0, B = 0; 5 6 strData = HSV.split(","); 7 if (strData.length >= 2) 8 { 9 double R1, G1, B1, H, S, V, H1, X, C, m; 10 11 H = Double.parseDouble(strData[0]); 12 S = Double.parseDouble(strData[1]); 13 V = Double.parseDouble(strData[2]); 14 15 C = V * S; 16 H1 = H / 60; 17 X = Math.abs((H1 % 2) - 1); 18 X = C * (1 - X); 19 20 if (H1 >= 0 && H1 < 1) { 21 R1 = C; G1 = X; B1 = 0; } 22 else if (H1 >= 1 && H1 < 2) { 23 R1 = X; G1 = C; B1 = 0; } 24 else if (H1 >= 2 && H1 < 3) { 25 R1 = 0; G1 = C; B1 = X; } 26 else if (H1 >= 3 && H1 < 4) { 27 R1 = 0; G1 = X; B1 = C; } 28 else if (H1 >= 4 && H1 < 5) { 29 R1 = X; G1 = 0; B1 = C; } 30 else if (H1 >= 5 && H1 < 6) { 31 R1 = C; G1 = 0; B1 = 0; } 32 else { 33 R1 = 0; G1 = 0; B1 = 0; } 34 35 m = V - C; 36 R = Math.round((R1 + m) * 255); 37 G = Math.round((G1 + m) * 255); 38 B = Math.round((B1 + m) * 255); 39 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 40 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 41 } 42 return strRet; 43 }

HSV terdiri dari bilangan Hue, Saturation dan Value, untuk memasukkan bilangan HSV ke function/method HSV_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HSV_RGB diatas adalah 251, 0.885, 0.918. Output dari function ini akan berupa data RGB bertipe string, contoh : 65,27,234.

39

II.7 TRANSFORMASI RGB KE HSI

Untuk mentransformasi dari RGB ke HSI. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, dengan max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh sudut hue[0,360] yang tepat untuk ruang warna HSI, menggunakan rumus seperti berikut : (http://en.wikipedia.org/wiki/HSL_and_HSV)

0, max 60 6 , max max 60 2 , max max 60 4 , max max

Nilai-nilai untuk s dan i pada HSI didefinisikan sebagai berikut :

0 , 1 ,

Rumus di atas menghasilkan nilai intensity dan saturation dalam jangkauan [0,1].

Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HSI, maka langkahnya adalah sebagai berikut :

Setiap nilai RGB(65, 67, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi , , = 0.255, 0.106, 0.918

RGB(0.255, 0.106, 0.918) ini yang akan ditransformasikan ke bentuk HSI. max = nilai B (blue) = 0.918, min = nilai G (green) = 0.106, max – min = 0.918 – 0.106 = 0.812.

40

h (Hue) = 60 4 , karena max = b (blue).

. . = 60 4 = 251 .

i (intensity) =

= 0.255 0.106 0.918 = 0.426

s (saturation) = 1 , karena max <> min

. = 1 = 0.751 . sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HSI(251, 0.751, 0.426) dengan jangkauan RGB [0,1].

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.7.A VISUAL BASIC 6

0 Private Function RGB_HSI(RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, I As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double, min As Double 8 9 R = CDbl(strData(0)) / 255 10 G = CDbl(strData(1)) / 255 11 B = CDbl(strData(2)) / 255 12 max = R 13 If max < G Then max = G 14 If max < B Then max = B 15 min = R 16 If min > G Then min = G 17 If min > B Then min = B 18 If max = min Then 19 H = 0 20 ElseIf max = R Then 21 H = 60 * (((G - B) / (max - min)) Mod 6) 22 ElseIf max = G Then 23 H = 60 * (((B - R) / (max - min)) + 2) 24 ElseIf max = B Then 25 H = 60 * (((R - G) / (max - min)) + 4) 26 End If

41

27 I = (R + G + B) / 3 28 If max = min Then 29 S = 0 30 Else 31 S = 1 - (min / I) 32 End If 33 End If 34 35 RGB_HSI = Format$(H, "0.000") + "," + Format$(S, "0.000") + "," + Format$(I, "0.000") 36 End Function

II.7.B VISUAL BASIC.NET

0 Private Function RGB_HSI(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim H As Double, S As Double, I As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 Dim max As Double 8 Dim min As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 If max = min Then 20 H = 0 21 ElseIf max = R Then 22 H = 60 * (((G - B) / (max - min)) Mod 6) 23 ElseIf max = G Then 24 H = 60 * (((B - R) / (max - min)) + 2) 25 ElseIf max = B Then 26 H = 60 * (((R - G) / (max - min)) + 4) 27 End If 28 29 I = (R + G + B) / 3 30 31 If max = min Then 32 S = 0 33 Else 34 S = 1 - (min / I) 35 End If 36 End If 37 38 Return H.ToString("0.000") + "," + S.ToString("0.000") + "," + I.ToString("0.000") 40 End Function

42

II.7.C C#

0 private string RGB_HSI(string RGB) 1 { 2 string[] strData; 3 double H = 0, S = 0, I = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 double min, max; 10 11 R = double.Parse(strData[0]) / 255; 12 G = double.Parse(strData[1]) / 255; 13 B = double.Parse(strData[2]) / 255; 14 max = R; 15 if (max < G) max = G; 16 if (max < B) max = B; 17 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 if (max == min) 23 H = 0; 24 else if (max == R) 25 H = 60 * (((G - B) / (max - min)) % 6); 26 else if (max == G) 27 H = 60 * (((B - R) / (max - min)) + 2); 28 else if (max == B) 29 H = 60 * (((R - G) / (max - min)) + 4); 30 31 I = (R + G + B) / 3; 32 33 if (max == min) 34 S = 0; 35 else 36 S = 1 - (min / I); 37 } 38 39 return H.ToString("0.000") + "," + S.ToString("0.000") + 40 "," + I.ToString("0.000"); 41 }

43

II.7.D JAVA

0 private String RGB_HSI(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double H = 0, S = 0, I = 0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 double min, max; 11 12 R = Double.parseDouble(strData[0]) / 255; 13 G = Double.parseDouble(strData[1]) / 255; 14 B = Double.parseDouble(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 if (max == min) 23 H = 0; 24 else if (max == R) 25 H = 60 * (((G - B) / (max - min)) % 6); 26 else if (max == G) 27 H = 60 * (((B - R) / (max - min)) + 2); 28 else if (max == B) 29 H = 60 * (((R - G) / (max - min)) + 4); 30 31 I = (R + G + B) / 3; 32 if (max == min) 33 S = 0; 34 else 35 S = 1 - (min / I); 36 37 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 38 strRet = df.format(H) + "," + df.format(S) + "," + df.format(I); 39 } 40 return strRet; 41 }

RGB terdiri dari bilangan Red, Green dan Blue, untuk memasukkan bilangan RGB ke function/method dibawah, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method dibawah adalah 65,27,234. Output dari function ini akan berupa data HSI bertipe string, contoh : 251, 0.751, 0.426.

44

II.8 TRANSFORMASI HSI KE RGB

Untuk transformasi kembali dari HSI ke RGB, gunakan rumus berikut. Dengan hue H [0°, 360°), saturation S [0, 1], dan intensity I [0, 1] [Gonzales and Woods, 1992] :

Jika, 00 ≤ H < 1200 1

cos 1 cos 60

Jika, 1200 ≤ H < 2400 120

1

cos 1 cos 60

1

Jika, 2400 ≤ H < 3600 240

1

cos 1 cos 60

1

Untuk setiap r, g dan b :

3, 3, 3.

Rumus di atas menghasilkan nilai RGB dalam jangkauan [0,1]. Untuk jangkauan [0,255], kalikan dahulu dengan 255.

45

Transformasikan HSI(251, 0.751, 0.426) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut :

Periksa nilai H (hue), H =251, maka

H = H – 2400 = 251 – 240 = 11

g = 1 = 1 0.751 = 0.083

b = 1

. = 1

. . = 1 = 0.71 .

r = 1 – (g + b)

= 1 – (0.083 + 0.71) = 0.207

R (red) = 3Ir = 3 x 0.426 x 0.207 = 0.264

G (green) = 3Ig = 3 x 0.426 x 0.0813 = 0.104

B (blue) = 3Ib = 3 x 0.426 x 0.71 = 0.907

RGB (0.264, 0.104, 0.907) ini dalam jangkauan [0,1] untuk jangkauan [0,255] kalikan dengan 255 : (0.264 x 255, 0.104 x 255, 0.907 x 255) menjadi (67.32, 26.52, 231.285) bulatkan keatas menjadi (67, 27, 231).

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.8.A VISUAL BASIC 6

0 Private Function HSI_RGB(HSI As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(HSI, ",") 5 If UBound(strData) >= 2 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, I As Double 8

46

9 H = CDbl(strData(0)) 10 S = CDbl(strData(1)) 11 I = CDbl(strData(2)) 12 13 If H >= 0 And H < 120 Then 14 B1 = (1 - S) / 3 15 R1 = (((S * Cos(H)) / Cos(60 - H)) + 1) / 3 16 G1 = B1 + R1 17 ElseIf H >= 120 And H < 240 Then 18 H = H - 120 19 R1 = (1 - S) / 3 20 G1 = (((S * Cos(H)) / Cos(60 - H)) + 1) / 3 21 B1 = 1 - (R1 - G1) 22 Else 23 H = H - 240 24 G1 = (1 - S) / 3 25 B1 = (((S * Cos(H)) / Cos(60 - H)) + 1) / 3 26 R1 = 1 - (G1 + B1) 27 End If 28 29 R = Round((R1 * 3 * I) * 255) 30 G = Round((G1 * 3 * I) * 255) 31 B = Round((B1 * 3 * I) * 255) 32 End If 33 34 HSI_RGB = Format$(R, "###") + "," + Format$(G, "###") + _ 35 "," + Format$(B, "###") 36 End Function

II.8.B VISUAL BASIC.NET

0 Private Function HSI_RGB(ByVal HSI As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = HSI.Split(",") 5 If strData.Length >= 3 Then 6 Dim R1 As Double, G1 As Double, B1 As Double 7 Dim H As Double, S As Double, I As Double 8 9 H = CDbl(strData(0)) 10 S = CDbl(strData(1)) 11 I = CDbl(strData(2)) 12 13 If H >= 0 And H < 120 Then 14 B1 = (1 - S) / 3 15 R1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3 16 G1 = B1 + R1 17 ElseIf H >= 120 And H < 240 Then 18 H = H - 120 19 R1 = (1 - S) / 3 20 G1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3 21 B1 = 1 - (R1 - G1)

47

22 Else 23 H = H - 240 24 G1 = (1 - S) / 3 25 B1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3 26 R1 = 1 - (G1 + B1) 27 End If 28 29 R = Math.Round((R1 * 3 * I) * 255) 30 G = Math.Round((G1 * 3 * I) * 255) 31 B = Math.Round((B1 * 3 * I) * 255) 32 End If 33 34 Return R.ToString("###") + "," + G.ToString("###") + 35 "," + B.ToString("###") 36 End Function

II.8.C C#

0 private string HSI_RGB(string HSI) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = HSI.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R1, G1, B1; 9 double H, S, I; 10 11 H = double.Parse(strData[0]); 12 S = double.Parse(strData[1]); 13 I = double.Parse(strData[2]); 14 15 if (H >= 0 && H < 120) 16 { 17 B1 = (1 - S) / 3; 18 R1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3; 19 G1 = B1 + R1; 20 } 21 else if (H >= 120 && H < 240) 22 { 23 H = H - 120; 24 R1 = (1 - S) / 3; 25 G1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3; 26 B1 = 1 - (R1 - G1); 27 } 28 else 29 { 30 H = H - 240; 31 G1 = (1 - S) / 3; 32 B1 = (((S * Math.Cos(H)) / Math.Cos(60 - H)) + 1) / 3; 33 R1 = 1 - (G1 + B1); 34 }

48

35 36 R = Math.Round((R1 * 3 * I) * 255); 37 G = Math.Round((G1 * 3 * I) * 255); 38 B = Math.Round((B1 * 3 * I) * 255); 39 } 40 return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 41 }

II.8.D JAVA

0 private String HSI_RGB(String HSI) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R = 0, G = 0, B = 0; 5 6 strData = HSI.split(","); 7 if (strData.length >= 3) 8 { 9 double R1, G1, B1; 10 double H, S, I; 11 H = Double.parseDouble(strData[0]); 12 S = Double.parseDouble(strData[1]); 13 I = Double.parseDouble(strData[2]); 14 if (H >= 0 && H < 120) 15 { 16 B1 = (1 - S) / 3; 17 R1 = (((S * Math.cos(H)) / Math.cos(60 - H)) + 1) / 3; 18 G1 = B1 + R1; 19 } 20 else if (H >= 120 && H < 240) 21 { 22 H = H - 120; 23 R1 = (1 - S) / 3; 24 G1 = (((S * Math.cos(H)) / Math.cos(60 - H)) + 1) / 3; 25 B1 = 1 - (R1 - G1); 26 } 27 else 28 { 29 H = H - 240; 30 G1 = (1 - S) / 3; 31 B1 = (((S * Math.cos(H)) / Math.cos(60 - H)) + 1) / 3; 32 R1 = 1 - (G1 + B1); 33 } 34 35 R = Math.round((R1 * 3 * I) * 255); 36 G = Math.round((G1 * 3 * I) * 255); 37 B = Math.round((B1 * 3 * I) * 255); 38 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 39 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 40 } 41 return strRet; 42 }

49

HSI terdiri dari bilangan Hue, Saturation dan Intensity, untuk memasukkan bilangan HSI ke function/method HSI_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HSI_RGB diatas adalah 251, 0.756, 0.426. Output dari function ini akan berupa data RGB bertipe string, contoh : 67, 27, 231.

II.9 TRANSFORMASI RGB KE HCL

Untuk mentransformasi dari RGB ke HCL. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, dengan max adalah nilai maksimum dari nilai red, green, blue, dan min adalah nilai minimum dari nilai red, green, blue. Untuk memperoleh luminance untuk ruang warna HCL, menggunakan rumus seperti berikut [Madenda and Missaoui, 2005] :

. , , 1 . ,, 2 dimana . adalah parameter yang memungkinkan untuk pengaturan terhadap pengaruh perubahan intensitas, α=0 jika Max(R,G,B)=0, dan jika tidak ,, . ,, Sedang parameter Y0 adalah nilai stimulasi untuk referensi warnah putih dimana Y0 = 100 untuk standar iluminasi CIE D65. Parameter γ (1 ≤ γ ≤ 31) adalah faktor koreksi terhadap kondisi pencahayaan manusia.

|| || || 3 Untuk Hue adalah, arctan

0 2 0 0 3

60

0 0 180

4 0 0 3

120 2 0 0 180 3

50

Misalnya ingin ditransformasikan RGB(65, 27, 234) ke dalam bentuk HCL, maka langkahnya adalah sebagai berikut :

Setiap nilai RGB(65, 67, 234) diubah dalam jangkauan [0,1] dengan membagi setiap nilai dengan 255 : menjadi , , = 0.255, 0.106, 0.918

RGB(0.255, 0.106, 0.918) ini yang akan ditransformasikan ke bentuk HCL.

Max(R, G, B) = nilai B (blue) = 0.918, Min (R, G, B) =nilai G (green) = 0.106.

. α = ,, = 0.001154684 ,, .

parameter γ (Gamma) kita ambil = 30.

Q = . = . = . = 1.035

. ,, . ,, . . . . L = 0.477

|| || || . |. .| |. .| |. .| C = 0.56

. . H = arctan arctan arctan5.45 79.6 . .

Karena, R – G = 0.255 – 0.106 = 0.149 > 0, dan G – B = 0.106 – 0.918 = -0.812 < 0, maka

H = 79.6 106.13 sehingga nilai RGB(65, 27, 234) ditransformasikan menjadi HCL(-106.130, 0.56, 0.477) dengan jangkauan RGB [0,1].

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

51

II.10.A VISUAL BASIC 6

0 Private Function RGB_HCL(RGB As String, Gamma As Double) As String 1 Dim strData() As String 2 Const PI As Double = 3.14159265358979 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 Dim alpha As Double, max As Double, min As Double 8 Dim Q As Double, L As Double, C As Double, H As Double 9 10 R = CDbl(strData(0)) / 255 11 G = CDbl(strData(1)) / 255 12 B = CDbl(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 20 alpha = min / (max * Gamma) 21 Q = Exp(alpha) 22 L = ((Q * max) + ((Q - 1) * min)) / 2 23 C = (Q * (Abs(R - G) + Abs(G - B) + Abs(B - R))) / 3 24 25 H = Atn((G - B) / (R - G)) * (180 / PI) 26 If R = G And R = B Then 27 H = -1 28 ElseIf G = B And G < R Then 29 H = 0 30 ElseIf (R - G >= 0) And (G - B) >= 0 Then 31 H = (2 * H) / 3 32 ElseIf R = G And R > B Then 33 H = 60 34 ElseIf (R - G < 0) And (G - B >= 0) Then 35 H = 180 + ((4 * H) / 3) 36 ElseIf (R - G >= 0) And (G - B < 0) Then 37 H = (4 * H) / 3 38 ElseIf R = G And R < B Then 39 H = -120 40 ElseIf (R - G < 0) And (G - B < 0) Then 41 H = ((2 * H) / 3) - 180 42 End If 43 End If 44 45 RGB_HCL = Format$(H, "0.000") + "," + Format$(C, "0.000") + "," + Format$(L, "0.000") 46 End Function

52

II.10.A VISUAL BASIC.NET

0 Private Function RGB_HCL(ByVal RGB As String, ByVal Gamma As Double) As String 1 Dim strData() As String 2 Dim Q As Double, L As Double, C As Double, H As Double 3 Const PI As Double = 3.14159265358979 4 5 strData = RGB.Split(",") 6 If strData.Length >= 3 Then 7 Dim R As Double, G As Double, B As Double 8 Dim alpha As Double, max As Double, min As Double 9 10 R = Double.Parse(strData(0)) / 255 11 G = Double.Parse(strData(1)) / 255 12 B = Double.Parse(strData(2)) / 255 13 max = R 14 If max < G Then max = G 15 If max < B Then max = B 16 min = R 17 If min > G Then min = G 18 If min > B Then min = B 19 20 alpha = min / (max * Gamma) 21 Q = Math.Exp(alpha) 22 L = ((Q * max) + ((Q - 1) * min)) / 2 23 C = (Q * (Math.Abs(R - G) + Math.Abs(G - B) + Math.Abs(B - R))) / 3 24 25 H = Math.Atan((G - B) / (R - G)) * (180 / PI) 26 If R = G And R = B Then 27 H = -1 28 ElseIf G = B And G < R Then 29 H = 0 30 ElseIf (R - G >= 0) And (G - B) >= 0 Then 31 H = (2 * H) / 3 32 ElseIf R = G And R > B Then 33 H = 60 34 ElseIf (R - G < 0) And (G - B >= 0) Then 35 H = 180 + ((4 * H) / 3) 36 ElseIf (R - G >= 0) And (G - B < 0) Then 37 H = (4 * H) / 3 38 ElseIf R = G And R < B Then 39 H = -120 40 ElseIf (R - G < 0) And (G - B < 0) Then 41 H = ((2 * H) / 3) - 180 42 End If 43 End If 44 45 Return H.ToString("0.000") + "," + C.ToString("0.000") + "," + L.ToString("0.000") 46 End Function

53

II.10.A C#

0 private string RGB_HCL(string RGB, double Gamma) 1 { 2 string[] strData; 3 double Q, L=0, C=0, H=0; 4 const double PI = 3.14159265358979; 5 6 strData = RGB.Split(','); 7 if (strData.Length >= 3) 8 { 9 double R, G, B; 10 double alpha, max, min; 11 12 R = double.Parse(strData[0]) / 255; 13 G = double.Parse(strData[1]) / 255; 14 B = double.Parse(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 alpha = min / (max * Gamma); 23 Q = Math.Exp(alpha); 24 L = ((Q * max) + ((Q - 1) * min)) / 2; 25 C = (Q * (Math.Abs(R - G) + Math.Abs(G - B) + Math.Abs(B - R))) / 3; 26 27 H = Math.Atan((G - B) / (R - G)) * (180 / PI); 28 if (R == G && R == B) 29 H = -1; 30 else if (G == B && G < R) 31 H = 0; 32 else if ( (R - G >= 0) && (G - B) >= 0) 33 H = (2 * H) / 3; 34 else if ( R == G && R > B) 35 H = 60; 36 else if ( (R - G < 0) && (G - B >= 0)) 37 H = 180 + ((4 * H) / 3); 38 else if ( (R - G >= 0) && (G - B < 0)) 39 H = (4 * H) / 3; 40 else if (R == G && R < B) 41 H = -120; 42 else if ((R - G < 0) && (G - B < 0)) 43 H = ((2 * H) / 3) - 180; 44 } 45 46 return H.ToString("0.000") + "," + C.ToString("0.000") + "," + L.ToString("0.000"); 47 }

54

II.10.A JAVA

0 private String RGB_HCL(String RGB, double Gamma) 1 { 2 String[] strData; 3 double Q, L=0, C=0, H=0; 4 double PI = 3.14159265358979; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 double alpha, max, min; 11 12 R = Double.parseDouble(strData[0]) / 255; 13 G = Double.parseDouble(strData[1]) / 255; 14 B = Double.parseDouble(strData[2]) / 255; 15 max = R; 16 if (max < G) max = G; 17 if (max < B) max = B; 18 min = R; 19 if (min > G) min = G; 20 if (min > B) min = B; 21 22 alpha = min / (max * Gamma); 23 Q = Math.exp(alpha); 24 L = ((Q * max) + ((Q - 1) * min)) / 2; 25 C = (Q * (Math.abs(R - G) + Math.abs(G - B) + Math.abs(B - R))) / 3; 26 27 H = Math.atan((G - B) / (R - G)) * (180 / PI); 28 if (R == G && R == B) 29 H = -1; 30 else if (G == B && G < R) 31 H = 0; 32 else if ( (R - G >= 0) && (G - B) >= 0) 33 H = (2 * H) / 3; 34 else if ( R == G && R > B) 35 H = 60; 36 else if ( (R - G < 0) && (G - B >= 0)) 37 H = 180 + ((4 * H) / 3); 38 else if ( (R - G >= 0) && (G - B < 0)) 39 H = (4 * H) / 3; 40 else if (R == G && R < B) 41 H = -120; 42 else if ((R - G < 0) && (G - B < 0)) 43 H = ((2 * H) / 3) - 180; 44 } 45 46 java.text.DecimalFormat df = new java.text.DecimalFormat ("#.###"); 47 String strRet = df.format(H) + "," + df.format(C) + "," + df.format(L); 48 49 return strRet; 50 }

55

Pengiriman parameter ke function/method RGB_HCL diatas adalah nilai RGB contoh : 65, 27, 234, dan parameter Gamma. Gamma berada dalam jangkauan [0,31]. Output dari function/method ini akan berupa data HCL bertipe string, contoh : - 106.13, 0.56, 0.477.

II.10 TRANSFORMASI HCL KE RGB

Untuk transformasi kembali dari HCL ke RGB [Madenda and Missaoui, 2005], dilakukan dalam dua tahap. tahap pertama adalah menghitung Q, Max dan Min :

4 3 3 4 2 2

4 3 4 2 kemudian mengecek nilai H (hue) : Jika, 00 ≤ H ≤ 600 R = Max, B = Min

tan 1

Jika, 600 < H ≤ 1200 G = Max, B = Min

1 tan tan

Jika, 1200 < H ≤ 1800 G = Max, R = Min 1 180 180

Jika, -600 ≤ H < 00 R = Max, G = Min

1

56

Jika, -1200 ≤ H < -600 B = Max, G = Min

1 tan tan

Jika, -1800 < H < -1200 B = Max, R = Min

tan 1 tan

Transformasikan HCL(-106.130, 0.56, 0.477) ke dalam bentuk RGB, maka langkahnya adalah sebagai berikut : parameter γ (Gamma) = 30. Sesuai dengan parameter yang kita ambil sebelumnya saat transformasi dari RGB ke HCL.

. Q = . . 1.0367

. . . Max = 0.916 . .

. . Min = 0.106 .

Karena, H = -106.130 > -600, dan H ≤ -1200, maka

B = Max = 0.916, G = Min = 0.106

. 1 tan 0.106 1 tan – 0.916 0.312 . tan tan

sehingga nilai HCL(-106.130, 0.56, 0.477) ditransformasikan menjadi RGB(0.312, 0.106, 0.916) dengan jangkauan RGB [0,1]. Kalikan dengan 255 menjadi : (0.312 x 255, 0.106 x 255, 0.916 x 255) menjadi (79.56, 27,03, 233.58) bulatkan keatas menjadi (80, 27, 234).

Berdasarkan langkah-langkah transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

57

II.10.A VISUAL BASIC 6

0 Private Function HCL_RGB(HCL As String, Gamma As Double) As String 1 Dim strData() As String 2 Const PI As Double = 3.14159265358979 3 Dim R As Double, G As Double, B As Double 4 5 strData = Split(HCL, ",") 6 If UBound(strData) >= 2 Then 7 Dim Q As Double, max As Double, min As Double 8 Dim H As Double, C As Double, L As Double 9 Dim tanH As Double 10 11 H = CDbl(strData(0)) 12 C = CDbl(strData(1)) 13 L = CDbl(strData(2)) 14 15 Q = Exp((1 - (3 * C) / (4 * L)) * (Gamma / 100)) 16 min = ((4 * L) - (3 * C)) / ((4 * Q) - 2) 17 max = (3 * C) / (2 * Q) 18 max = min + max 19 20 If H >= 0 And H <= 60 Then 21 tanH = Tan(H * 1.5 * PI / 180) 22 R = max 23 B = min 24 G = ((R * tanH) + B) / (1 + tanH) 25 ElseIf H > 60 And H <= 120 Then 26 H = H - 180 27 tanH = Tan(H * 0.75 * PI / 180) 28 G = max 29 B = min 30 R = ((G * (1 + tanH)) - B) / tanH 31 ElseIf H > 120 And H <= 180 Then 32 H = H - 180 33 tanH = Tan(H * 0.75 * PI / 180) 34 G = max 35 R = min 36 B = (G * (1 + tanH)) - (R * tanH) 37 ElseIf H >= -60 And H < 0 Then 38 tanH = Tan(H * 0.75 * PI / 180) 39 R = max 40 G = min 41 B = (G * (1 + tanH)) - (R * tanH) 42 ElseIf H >= -120 And H < -60 Then 43 tanH = Tan(H * 0.75 * PI / 180) 44 B = max 45 G = min 46 R = ((G * (1 + tanH)) - B) / tanH 47 ElseIf H > -180 And H < -120 Then 48 H = H + 180 49 tanH = Tan(H * 1.5 * PI / 180) 50 B = max 51 R = min

58

52 G = ((R * tanH) + B) / (1 + tanH) 53 End If 54 55 R = Round(R * 255) 56 G = Round(G * 255) 57 B = Round(B * 255) 58 End If 59 60 HCL_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 61 End Function

II.10.A VISUAL BASIC.NET

0 Private Function HCL_RGB(ByVal HCL As String, ByVal Gamma As Double) As String 1 Dim strData() As String 2 Const PI As Double = 3.14159265358979 3 Dim R As Double, G As Double, B As Double 4 5 strData = HCL.Split(",") 6 If strData.Length >= 3 Then 7 Dim Q As Double, max As Double, min As Double 8 Dim H As Double, C As Double, L As Double 9 Dim tanH As Double 10 11 H = Double.Parse(strData(0)) 12 C = Double.Parse(strData(1)) 13 L = Double.Parse(strData(2)) 14 15 Q = Math.Exp((1 ‐ (3 * C) / (4 * L)) * (Gamma / 100)) 16 min = ((4 * L) ‐ (3 * C)) / ((4 * Q) ‐ 2) 17 max = (3 * C) / (2 * Q) 18 max = min + max 19 20 If H >= 0 And H <= 60 Then 21 tanH = Math.Tan(H * 1.5 * PI / 180) 22 R = max 23 B = min 24 G = ((R * tanH) + B) / (1 + tanH) 25 ElseIf H > 60 And H <= 120 Then 26 H = H ‐ 180 27 tanH = Math.Tan(H * 0.75 * PI / 180) 28 G = max 29 B = min 30 R = ((G * (1 + tanH)) ‐ B) / tanH 31 ElseIf H > 120 And H <= 180 Then 32 H = H ‐ 180 33 tanH = Math.Tan(H * 0.75 * PI / 180) 34 G = max 35 R = min 36 B = (G * (1 + tanH)) ‐ (R * tanH) 37 ElseIf H >= ‐60 And H < 0 Then 38 tanH = Math.Tan(H * 0.75 * PI / 180) 39 R = max 40 G = min

59

41 B = (G * (1 + tanH)) ‐ (R * tanH) 42 ElseIf H >= ‐120 And H < ‐60 Then 43 tanH = Math.Tan(H * 0.75 * PI / 180) 44 B = max 45 G = min 46 R = ((G * (1 + tanH)) ‐ B) / tanH 47 ElseIf H > ‐180 And H < ‐120 Then 48 H = H + 180 49 tanH = Math.Tan(H * 1.5 * PI / 180) 50 B = max 51 R = min 52 G = ((R * tanH) + B) / (1 + tanH) 53 End If 54 55 R = Math.Round(R * 255) 56 G = Math.Round(G * 255) 57 B = Math.Round(B * 255) 58 End If 59 60 HCL_RGB = R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###") 61 End Function

II.10.A C#

0 private string HCL_RGB(string HCL, double Gamma) 1 { 2 string[] strData; 3 const double PI = 3.14159265358979; 4 double R=0, G=0, B=0; 5 6 strData = HCL.Split(','); 7 if (strData.Length >= 3) 8 { 9 double Q, max, min; 10 double H, C, L; 11 double tanH; 12 13 H = double.Parse(strData[0]); 14 C = double.Parse(strData[1]); 15 L = double.Parse(strData[2]); 16 17 Q = Math.Exp((1 ‐ (3 * C) / (4 * L)) * (Gamma / 100)); 18 min = ((4 * L) ‐ (3 * C)) / ((4 * Q) ‐ 2); 19 max = (3 * C) / (2 * Q); 20 max = min + max; 21 22 if (H >= 0 && H <= 60) 23 { 24 tanH = Math.Tan(H * 1.5 * PI / 180); 25 R = max; 26 B = min; 27 G = ((R * tanH) + B) / (1 + tanH); 28 } 29 else if (H > 60 && H <= 120) 30 {

60

31 H = H ‐ 180; 32 tanH = Math.Tan(H * 0.75 * PI / 180); 33 G = max; 34 B = min; 35 R = ((G * (1 + tanH)) ‐ B) / tanH; 36 } 37 else if (H > 120 && H <= 180) 38 { 39 H = H ‐ 180; 40 tanH = Math.Tan(H * 0.75 * PI / 180); 41 G = max; 42 R = min; 43 B = (G * (1 + tanH)) ‐ (R * tanH); 44 } 45 else if ( H >= ‐60 && H < 0) 46 { 47 tanH = Math.Tan(H * 0.75 * PI / 180); 48 R = max; 49 G = min; 50 B = (G * (1 + tanH)) ‐ (R * tanH); 51 } 52 else if ( H >= ‐120 && H < ‐60) 53 { 54 tanH = Math.Tan(H * 0.75 * PI / 180); 55 B = max; 56 G = min; 57 R = ((G * (1 + tanH)) ‐ B) / tanH; 58 } 59 else if ( H > ‐180 && H < ‐120) 60 { 61 H = H + 180; 62 tanH = Math.Tan(H * 1.5 * PI / 180); 63 B = max; 64 R = min; 65 G = ((R * tanH) + B) / (1 + tanH); 66 } 67 68 R = Math.Round(R * 255); 69 G = Math.Round(G * 255); 70 B = Math.Round(B * 255); 71 } 72 73 return R.ToString("###") + "," + G.ToString("###") + "," + 74B.ToString("###"); 75 }

II.10.A JAVA

0 private String HCL_RGB(String HCL, double Gamma) 1 { 2 String[] strData; 3 double PI = 3.14159265358979; 4 double R=0, G=0, B=0; 5 6 strData = HCL.split(",");

61

7 if (strData.length >= 2) 8 { 9 double Q, max, min; 10 double H, C, L; 11 double tanH; 12 13 H = Double.parseDouble(strData[0]); 14 C = Double.parseDouble(strData[1]); 15 L = Double.parseDouble(strData[2]); 16 17 Q = Math.exp((1 - (3 * C) / (4 * L)) * (Gamma / 100)); 18 min = ((4 * L) - (3 * C)) / ((4 * Q) - 2); 19 max = (3 * C) / (2 * Q); 20 max = min + max; 21 22 if (H >= 0 && H <= 60) 23 { 24 tanH = Math.tan(H * 1.5 * PI / 180); 25 R = max; 26 B = min; 27 G = ((R * tanH) + B) / (1 + tanH); 28 } 29 else if (H > 60 && H <= 120) 30 { 31 H = H - 180; 32 tanH = Math.tan(H * 0.75 * PI / 180); 33 G = max; 34 B = min; 35 R = ((G * (1 + tanH)) - B) / tanH; 36 } 37 else if (H > 120 && H <= 180) 38 { 39 H = H - 180; 40 tanH = Math.tan(H * 0.75 * PI / 180); 41 G = max; 42 R = min; 43 B = (G * (1 + tanH)) - (R * tanH); 44 } 45 else if ( H >= -60 && H < 0) 46 { 47 tanH = Math.tan(H * 0.75 * PI / 180); 48 R = max; 49 G = min; 50 B = (G * (1 + tanH)) - (R * tanH); 51 } 52 else if ( H >= -120 && H < -60) 53 { 54 tanH = Math.tan(H * 0.75 * PI / 180); 55 B = max; 56 G = min; 57 R = ((G * (1 + tanH)) - B) / tanH; 58 } 59 else if ( H > -180 && H < -120) 60 { 61 H = H + 180;

62

62 tanH = Math.tan(H * 1.5 * PI / 180); 63 B = max; 64 R = min; 65 G = ((R * tanH) + B) / (1 + tanH); 66 } 67 68 R = Math.round(R * 255); 69 G = Math.round(G * 255); 70 B = Math.round(B * 255); 71 } 72 73 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 74 String strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 75 return strRet; 76 }

HCL terdiri dari bilangan Hue, Chroma dan Luminance, dan parameter Gamma. Gamma berada dalam jangkauan [0,31], nilai parameter ini harus sama dengan nilai saat di transformasi awal dari RGB ke HCL. Untuk memasukkan bilangan HCL ke function/method HCL_RGB diatas, data dipisahkan oleh tanda koma (,), jadi contoh pengiriman parameter ke function/method HCL_RGB diatas adalah -106.13, 0.56, 0.477 untuk parameter pertama dan 30 untuk parameter kedua. Output dari function ini akan berupa data RGB bertipe string, contoh : 80, 27, 234.

II.11 TRANSFORMASI RGB KE YUV DAN YUV KE RGB

Untuk mentransformasi dari RGB ke YUV. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB, menggunakan rumus seperti berikut : (sumber : http://en.wikipedia.org/wiki/YUV)

0.299 0.587 0.114 0.436 0.886 0.615 0.701

Untuk transformasi kembali dari YUV ke RGB, gunakan rumus berikut :

1.254 0.395 0.58 2.03

Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

63

II.11.A VISUAL BASIC 6

0 Private Function RGB_YUV(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, U As Double, V As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 U = 0.436 * ((B - Y) / 0.886) 14 V = 0.615 * ((R - Y) / 0.701) 15 End If 16 17 RGB_YUV = Format$(Y, "0.000") + "," + Format$(U, "0.000") + _ 18 "," + Format$(V, "0.000") 19 End Function

0 Private Function YUV_RGB(YUV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YUV, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, U As Double, V As Double 7 8 Y = CDbl(strData(0)) 9 U = CDbl(strData(1)) 10 V = CDbl(strData(2)) 11 12 R = Round((Y + (V * 1.254)) * 255) 13 G = Round((Y - (U * 0.395) - (V * 0.58)) * 255) 14 B = Round((Y + (U * 2.03)) * 255) 15 End If 16 17 YUV_RGB = Format$(R, "###") + "," + Format$(G, "###") + _ 18 "," + Format$(B, "###") 19 End Function

II.11.B VISUAL BASIC.NET

0 Private Function RGB_YUV(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, U As Double, V As Double 3 4 strData = RGB.Split(",")

64

5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 12 U = 0.436 * ((B - Y) / 0.886) 13 V = 0.615 * ((R - Y) / 0.701) 14 End If 15 16 Return Y.ToString("0.000") + "," + U.ToString("0.000") + _ 17 "," + V.ToString("0.000") 18 End Function

0 Private Function YUV_RGB(ByVal YUV As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = strData = YUV.Split(",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, U As Double, V As Double 7 8 Y = CDbl(strData(0)) 9 U = CDbl(strData(1)) 10 V = CDbl(strData(2)) 11 12 R = Math.Round((Y + (V * 1.254)) * 255) 13 G = Math.Round((Y - (U * 0.395) - (V * 0.58)) * 255) 14 B = Math.Round((Y + (U * 2.03)) * 255) 15 End If 16 17 Return R.ToString("###") + "," + G.ToString("###") + _ 18 "," + B.ToString("###") 19 End Function

II.11.C C#

0 private string RGB_YUV(string RGB) 1 { 2 string[] strData; 3 double Y=0, U=0, V=0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255; 11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13

65

14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 U = 0.436 * ((B - Y) / 0.886); 16 V = 0.615 * ((R - Y) / 0.701); 17 } 18 19 return Y.ToString("0.000") + "," + U.ToString("0.000") + 20 "," + V.ToString("0.000"); 21 }

0 private string YUV_RGB(string YUV) 1 { 2 string[] strData; 3 double R=0, G=0, B=0; 4 5 strData = YUV.Split(','); 6 if (strData.Length >= 3) 7 { 8 double Y, U, V; 9 10 Y = double.Parse(strData[0]); 11 U = double.Parse(strData[1]); 12 V = double.Parse(strData[2]); 13 14 R = Math.Round((Y + (V * 1.254)) * 255); 15 G = Math.Round((Y - (U * 0.395) - (V * 0.58)) * 255); 16 B = Math.Round((Y + (U * 2.03)) * 255); 17 } 18 19 return R.ToString("###") + "," + G.ToString("###") + 20 "," + B.ToString("###"); 21 }

II.11.D JAVA

0 private String RGB_YUV(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, U=0, V=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0] / 255); 12 G = Double.parseDouble(strData[1] / 255); 13 B = Double.parseDouble(strData[2] / 255); 14 15 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 16 U = 0.436 * ((B - Y) / 0.886);

66

17 V = 0.615 * ((R - Y) / 0.701); 18 19 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 20 strRet = df.format(Y) + "," + df.format(U) + "," + df.format(V); 21 } 22 return strRet; 23 }

0 private static String YUV_RGB(String YUV) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 6 strData = YUV.split(","); 7 if (strData.length >= 2) 8 { 9 double Y, U, V;

10 Y = Double.parseDouble(strData[0]); 11 U = Double.parseDouble(strData[1]); 12 V = Double.parseDouble(strData[2]); 13 14 R = Math.round((Y + (V * 1.254)) * 255); 15 G = Math.round((Y - (U * 0.395) - (V * 0.58)) * 255); 16 B = Math.round((Y + (U * 2.03)) * 255); 17 18 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 19 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 20 } 21 return strRet; 22 }

Pengiriman parameter ke function/method RGB_YUV diatas adalah nilai RGB contoh : 65, 27, 234. Output dari function/method ini akan berupa data YUV bertipe string, contoh : 0.243,0.332,0.010. Dan sebaliknya untuk function/method YUV_RGB menerima parameter nilai YUV, dan menghasilkan nilai RGB.

II.12 TRANSFORMASI RGB KE YDbDr dan YDbDr KE RGB

Untuk mentransformasi dari RGB ke YDbDr. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB dan Db, Dr[-1.333, 1.333] menggunakan rumus seperti berikut : (http://en.wikipedia.org/wiki/YDbDr)

Y = 0.299R + 0.587G + 0.114B Db = -045R – 0.883G + 1.333B Dr = -1.333R + 1.116G + 0.217B

67

Untuk transformasi kembali dari YDbDr ke RGB, gunakan rumus berikut :

R = Y + 0.000092303716148Db - 0.525912630661865Dr G = Y - 0.129132898890509Db + 0.267899328207599Dr B = Y + 0.664679059978955Db - 0.000079202543533Dr

Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.12.A VISUAL BASIC 6

0 Private Function RGB_YDbDr(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Db As Double, Dr As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 12 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B) 13 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B) 14 End If 15 RGB_YDbDr = Format$(Y, "0.000") + "," + Format$(Db, "0.000") + "," + Format$(Dr, "0.000") 16 End Function

0 Private Function YDbDr_RGB(YDbDr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YDbDr, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Db As Double, Dr As Double 7 8 Y = CDbl(strData(0)) 9 Db = CDbl(strData(1)) 10 Dr = CDbl(strData(2)) 11 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr) 12 R = Round(R * 255) 13 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr) 14 G = Round(G * 255) 15 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr) 16 B = Round(B * 255) 17 End If 18 YDbDr_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 19 End Function

68

II.12.B VISUAL BASIC.NET

0 Private Function RGB_YDbDr(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Db As Double, Dr As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B) 14 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B) 15 End If 16 17 Return Y.ToString("0.000") + "," + Db.ToString("0.000") + "," + Dr.ToString("0.000") 18 End Function

0 Private Function YDbDr_RGB(ByVal YDbDr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = YDbDr.Split(",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Db As Double, Dr As Double 7 8 Y = CDbl(strData(0)) 9 Db = CDbl(strData(1)) 10 Dr = CDbl(strData(2)) 11 12 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr) 13 R = Math.Round(R * 255) 14 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr) 15 G = Math.Round(G * 255) 16 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr) 17 B = Math.Round(B * 255) 18 End If 19 20 Return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###") 21 End Function

69

II.12.C C#

0 private string RGB_YDbDr(string RGB) 1 { 2 string[] strData; 3 double Y = 0, Db = 0, Dr = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255; 11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B); 16 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B); 17 } 18 19 return Y.ToString("0.000") + "," + Db.ToString("0.000") + "," + Dr.ToString("0.000"); 20 }

0 private string YDbDr_RGB(string YDbDr) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = YDbDr.Split(','); 6 if (strData.Length >= 3) 7 { 8 double Y, Db, Dr; 9 10 Y = double.Parse(strData[0]) / 255; 11 Db = double.Parse(strData[1]) / 255; 12 Dr = double.Parse(strData[2]) / 255; 13 14 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr); 15 R = Math.Round(R * 255); 16 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr); 17 G = Math.Round(G * 255); 18 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr); 19 B = Math.Round(B * 255); 20 } 21 22 return R.ToString("###") + "," + G.ToString("###") + "," + B.ToString("###"); 23 }

70

II.12.D JAVA

0 private String RGB_YDbDr(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, Db=0, Dr=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0]) / 255; 12 G = Double.parseDouble(strData[1]) / 255; 13 B = Double.parseDouble(strData[2]) / 255; 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Db = (-0.45 * R) - (0.883 * G) + (1.333 * B); 16 Dr = (-1.333 * R) + (1.116 * G) + (0.217 * B); 17 18 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 19 strRet = df.format(Y) + "," + df.format(Db) + "," + df.format(Dr); 20 } 21 return strRet; 22 }

0 private static String YDbDr_RGB(String YDbDr) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 6 strData = YDbDr.split(","); 7 if (strData.length >= 2) 8 { 9 double Y, Db, Dr; 10 11 Y = Double.parseDouble(strData[0]); 12 Db = Double.parseDouble(strData[1]); 13 Dr = Double.parseDouble(strData[2]); 14 15 R = Y + (0.000092303716148 * Db) - (0.525912630661865 * Dr); 16 R = Math.round(R * 255); 17 G = Y - (0.129132898890509 * Db) + (0.267899328207599 * Dr); 18 G = Math.round(G * 255); 19 B = Y + (0.664679059978955 * Db) - (0.000079202543533 * Dr); 20 B = Math.round(B * 255); 21 22 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 23 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 24 } 25 return strRet; 26 }

71

Pengiriman parameter ke function/method RGB_YDbDr diatas adalah nilai RGB contoh : 65, 27, 234. Output dari function/method ini akan berupa data YDbDr bertipe string, contoh : 0.243, 1.015, -0.022. Dan juga sebaliknya untuk function/method YDbDr_RGB menerima parameter nilai YDbDr, dan mengembalikan nilai berupa nilai RGB.

II.13 TRANSFORMASI RGB KE YIQ DAN YIQ KE RGB (NTSC)

Untuk mentransformasi dari RGB ke YIQ. Diasumsikan koordinat-koordinat R, G, B [0,1] adalah berurutan merah, hijau, biru dalam ruang warna RGB dan I [-0.5957, 0.5957], Dr [-0.5226, 0.5226] menggunakan rumus seperti berikut : (sumber : http://en.wikipedia.org/wiki/YIQ)

Y = 0.299R + 0.587G + 0.114B I = 0.595716R – 0.274453G – 0.321263B Q = 0.211456R – 0.522591G + 0.311135B

Untuk transformasi kembali dari YIQ ke RGB, gunakan rumus berikut :

R = Y + 0.9563I + 0.6210Q G = Y – 0.2721I – 0.6474Q B = Y – 1.1070I + 1.7046Q

Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

II.13.A VISUAL BASIC 6

0 Private Function RGB_YIQ(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, I As Double, Q As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B) 14 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B) 15 End If 16 17 RGB_YIQ = Format$(Y, "0.000") + "," + Format$(I, "0.000") + "," + Format$(Q, "0.000") 18 End Function

72

0 Private Function YIQ_RGB(YIQ As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YIQ, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, I As Double, Q As Double 7 8 Y = CDbl(strData(0)) 9 I = CDbl(strData(1)) 10 Q = CDbl(strData(2)) 11 12 R = Y + (0.9563 * I) + (0.621 * Q) 13 R = Round(R * 255) 14 G = Y - (0.2721 * I) - (0.6474 * Q) 15 G = Round(G * 255) 16 B = Y - (1.107 * I) + (1.7046 * Q) 17 B = Round(B * 255) 18 End If 19 20 YIQ_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 21 End Function

II.13.B VISUAL BASIC.NET

0 Private Function RGB_YIQ(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, I As Double, Q As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B) 14 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B) 15 End If 16 17 Return Y.ToString("0.000") + "," + I.ToString("0.000") + _ 18 "," + Q.ToString("0.000") 19 End Function

0 Private Function YIQ_RGB(ByVal YIQ As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = YIQ.Split(",")

73

5 If UBound(strData) >= 2 Then 6 Dim Y As Double, I As Double, Q As Double 7 8 Y = CDbl(strData(0)) 9 I = CDbl(strData(1)) 10 Q = CDbl(strData(2)) 11 12 R = Y + (0.9563 * I) + (0.621 * Q) 13 R = Math.Round(R * 255) 14 G = Y - (0.2721 * I) - (0.6474 * Q) 15 G = Math.Round(G * 255) 16 B = Y - (1.107 * I) + (1.7046 * Q) 17 B = Math.Round(B * 255) 18 End If 19 20 Return R.ToString("###") + "," + G.ToString("###") + _ 21 "," + B.ToString("###") 22 End Function

II.13.C C#

0 private string RGB_YIQ(string RGB) 1 { 2 string[] strData; 3 double Y = 0, I = 0, Q = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255; 11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B); 16 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B); 17 } 18 19 return Y.ToString("0.000") + "," + I.ToString("0.000") + 20 "," + Q.ToString("0.000"); 21 }

0 private string YIQ_RGB(string YIQ) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = YIQ.Split(','); 6 if (strData.Length >= 3)

74

7 { 8 double Y, I, Q; 9 10 Y = double.Parse(strData[0]); 11 I = double.Parse(strData[1]); 12 Q = double.Parse(strData[2]); 13 14 R = Y + (0.9563 * I) + (0.621 * Q); 15 R = Math.Round(R * 255); 16 G = Y - (0.2721 * I) - (0.6474 * Q); 17 G = Math.Round(G * 255); 18 B = Y - (1.107 * I) + (1.7046 * Q); 19 B = Math.Round(B * 255); 20 } 21 22 return R.ToString("###") + "," + G.ToString("###") + 23 "," + B.ToString("###"); 24 }

II.13.D JAVA

0 private String RGB_YIQ(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, I=0, Q=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0]) / 255; 12 G = Double.parseDouble(strData[1]) / 255; 13 B = Double.parseDouble(strData[2]) / 255; 14 15 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 16 I = (0.595716 * R) - (0.274453 * G) - (0.321263 * B); 17 Q = (0.211456 * R) - (0.522591 * G) + (0.311135 * B); 18 19 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 20 strRet = df.format(Y) + "," + df.format(I) + "," + df.format(Q); 21 } 22 return strRet; 23 }

0 private static String YIQ_RGB(String YIQ) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 strData = YIQ.split(",");

75

6 if (strData.length >= 2) 7 { 8 double Y, I, Q; 9 10 Y = Double.parseDouble(strData[0]); 11 I = Double.parseDouble(strData[1]); 12 Q = Double.parseDouble(strData[2]); 13 14 R = Y + (0.9563 * I) + (0.621 * Q); 15 R = Math.round(R * 255); 16 G = Y - (0.2721 * I) - (0.6474 * Q); 17 G = Math.round(G * 255); 18 B = Y - (1.107 * I) + (1.7046 * Q); 19 B = Math.round(B * 255); 20 21 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 22 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 23 } 24 return strRet; 25 }

Pengiriman parameter ke function/method RGB_YIQ diatas adalah nilai RGB contoh : 65,27,234. Output dari function/method ini akan berupa data YIQ bertipe string, contoh : 0.243, -0.172, 0.284. Dan juga sebaliknya untuk function/method YIQ_RGB menerima parameter nilai YIQ, dan mengembalikan nilai berupa data RGB.

II.14 TRANSFORMASI RGB KE YCbCr DAN YCbCr KE RGB

YCbCr (256 level) dapat diperoleh dari RGB dengan menggunakan rumus berikut (Hamilton,1992) :

Y = 0.299 R + 0.587 G + 0.114 B Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128 Cr = 0.5 R - 0.4187 G - 0.0813 B + 128

Sedangkan untuk konversi YCbCr ke RGB dapat dilakukan dengan rumus berikut (Hamilton,1992) :

R = Y + 1.402 (Cr - 128) G = Y - 0.34414 (Cb - 128) - 0.71414 (Cr - 128) B = Y + 1.772 (Cb - 128)

Berdasarkan rumus transformasi diatas, maka untuk mengimplementasikan ke bahasa pemrograman adalah sebagai berikut :

76

II.14.A VISUAL BASIC 6

0 Private Function RGB_YCbCr(RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Cb As Double, Cr As Double 3 4 strData = Split(RGB, ",") 5 If UBound(strData) >= 2 Then 6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128 14 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128 15 End If 16 RGB_YCbCr = Format$(Y, "0.000") + "," + Format$(Cb, "0.000") + "," + Format$(Cr, "0.000") 17 End Function

0 Private Function YCbCr_RGB(YCbCr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = Split(YCbCr, ",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Cb As Double, Cr As Double 7 8 Y = CDbl(strData(0)) 9 Cb = CDbl(strData(1)) 10 Cr = CDbl(strData(2)) 11 R = Y + (1.402 * (Cr - 128)) 12 R = Round(R * 255) 13 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)) 14 G = Round(G * 255) 15 B = Y + (1.772 * (Cb - 128)) 16 B = Round(B * 255) 17 End If 18 19 YCbCr_RGB = Format$(R, "###") + "," + Format$(G, "###") + "," + Format$(B, "###") 20 End Function

II.14.B VISUAL BASIC.NET

0 Private Function RGB_YCbCr(ByVal RGB As String) As String 1 Dim strData() As String 2 Dim Y As Double, Cb As Double, Cr As Double 3 4 strData = RGB.Split(",") 5 If strData.Length >= 3 Then

77

6 Dim R As Double, G As Double, B As Double 7 8 R = CDbl(strData(0)) / 255 9 G = CDbl(strData(1)) / 255 10 B = CDbl(strData(2)) / 255 11 12 Y = (0.299 * R) + (0.587 * G) + (0.114 * B) 13 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128 14 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128 15 End If 16 17 Return Y.ToString("0.000") + "," + Cb.ToString("0.000") + _ 18 "," + Cr.ToString("0.000") 19 End Function

0 Private Function YCbCr_RGB(ByVal YCbCr As String) As String 1 Dim strData() As String 2 Dim R As Double, G As Double, B As Double 3 4 strData = YCbCr.Split(",") 5 If UBound(strData) >= 2 Then 6 Dim Y As Double, Cb As Double, Cr As Double 7 8 Y = CDbl(strData(0)) 9 Cb = CDbl(strData(1)) 10 Cr = CDbl(strData(2)) 11 12 R = Y + (1.402 * (Cr - 128)) 13 R = Math.Round(R * 255) 14 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)) 15 G = Math.Round(G * 255) 16 B = Y + (1.772 * (Cb - 128)) 17 B = Math.Round(B * 255) 18 End If 19 20 Return R.ToString("###") + "," + G.ToString("###") + _ 21 "," + B.ToString("###") 22 End Function

II.14.C C#

0 private string RGB_YCbCr(string RGB) 1 { 2 string[] strData; 3 double Y = 0, Cb = 0, Cr = 0; 4 5 strData = RGB.Split(','); 6 if (strData.Length >= 3) 7 { 8 double R, G, B; 9 10 R = double.Parse(strData[0]) / 255;

78

11 G = double.Parse(strData[1]) / 255; 12 B = double.Parse(strData[2]) / 255; 13 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128; 16 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128; 17 } 18 19 return Y.ToString("0.000") + "," + Cb.ToString("0.000") + 20 "," + Cr.ToString("0.000"); 21 }

0 private string YCbCr_RGB(string YCbCr) 1 { 2 string[] strData; 3 double R = 0, G = 0, B = 0; 4 5 strData = YCbCr.Split(','); 6 if (strData.Length >= 3) 7 { 8 double Y, Cb, Cr; 9 10 Y = double.Parse(strData[0]); 11 Cb = double.Parse(strData[1]); 12 Cr = double.Parse(strData[2]); 13 14 R = Y + (1.402 * (Cr - 128)); 15 R = Math.Round(R * 255); 16 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)); 17 G = Math.Round(G * 255); 18 B = Y + (1.772 * (Cb - 128)); 19 B = Math.Round(B * 255); 20 } 21 22 return R.ToString("###") + "," + G.ToString("###") + 23 "," + B.ToString("###"); 24 }

II.14.D JAVA

0 private static String RGB_YCbCr(String RGB) 1 { 2 String[] strData; 3 String strRet = ""; 4 double Y=0, Cb=0, Cr=0; 5 6 strData = RGB.split(","); 7 if (strData.length >= 2) 8 { 9 double R, G, B; 10 11 R = Double.parseDouble(strData[0]) / 255;

79

12 G = Double.parseDouble(strData[1]) / 255; 13 B = Double.parseDouble(strData[2]) / 255; 14 Y = (0.299 * R) + (0.587 * G) + (0.114 * B); 15 Cb = (-0.1687 * R) - (0.3313 * G) + (0.5 * B) + 128; 16 Cr = (0.5 * R) - (0.4187 * G) - (0.0813 * B) + 128; 17 18 java.text.DecimalFormat df = new java.text.DecimalFormat ("0.000"); 19 strRet = df.format(Y) + "," + df.format(Cb) + "," + df.format(Cr); 20 } 21 return strRet; 22 }

0 private String YCbCr_RGB(String YCbCr) 1 { 2 String[] strData; 3 String strRet = ""; 4 double R=0, G=0, B=0; 5 6 strData = YCbCr.split(","); 7 if (strData.length >= 2) 8 { 9 double Y, Cb, Cr; 10 11 Y = Double.parseDouble(strData[0]); 12 Cb = Double.parseDouble(strData[1]); 13 Cr = Double.parseDouble(strData[2]); 14 15 R = Y + (1.402 * (Cr - 128)); 16 R = Math.round(R * 255); 17 G = Y - (0.34414 * (Cb - 128)) - (0.71414 * (Cr - 128)); 18 G = Math.round(G * 255); 19 B = Y + (1.772 * (Cb - 128)); 20 B = Math.round(B * 255); 21 22 java.text.DecimalFormat df = new java.text.DecimalFormat ("###"); 23 strRet = df.format(R) + "," + df.format(G) + "," + df.format(B); 24 } 25 return strRet; 26 }

Pengiriman parameter ke function/method RGB_YCbCr diatas adalah nilai RGB contoh : 65, 27, 234. Output dari function/method ini akan berupa data YCbCr bertipe string, contoh : 251.13, 0.756, 0.4257. Dan juga sebaliknya untuk function/method YCbCr_RGB menerima parameter nilai YCbCr, dan mengembalikan nilai berupa data RGB.

80

DAFTAR PUSTAKA

Cuturicu, C., 1999, A note about the JPEG decoding algorithm, http:// www.opennet.ru/ docs/ formats/ jpeg.txt.

Ford, A., dan Roberts, A., Agustus 1998, Colour Space Conversions,http:// www.inforamp.net/ ~poynton/ PDFs/ coloureq.pdf.

Gonzales and Woods, Digital Image Processing, 1st ed, Addison-Wesley, 1992.

Hamilton, E., September 1992, JPEG File Interchange Format, Version 1.02. http:// www.w3.org/ Graphics/ JPEG/ jfif.txt.

HSL and HSV, http://en.wikipedia.org/wiki/HSL_color_space.

M. Sarifuddin and Rokia Missaoui, HCL: a new for a more Effective Content-based Image Retrieval, RESEARCH REPORT D´epartement d’informatique et d’ing´enierie, Universit´e du Qu´ebec en Outaouais, C.P. 1250, Succ. B, Gatineau (Qc), Canada, J8X 3X7., 2005

RGB , http://en.wikipedia.org/wiki/RGB_color_model.

81

LAMPIRAN A MENGAMBIL NILAI RGB DARI CITRA

VISUAL BASIC 6

Private Declare Function GetPixel Lib "GDI32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long

0 Private Function GetRGBFromPos(pict As PictureBox, Width As Long, Height As Long) 1 Dim pixel As Long 2 Dim Red As Long, Green As Long, Blue As Long 3 Dim strRGB As String 4 5 pixel = GetPixel(pict.hDC, Width, Height) 6 'pixel = pict.Point(J, I) 7 Red = pixel And 255 8 Green = (pixel \ 256) And 255 9 Blue = (pixel \ 65536) And 255 10 11 GetRGBFromPos = CStr(Red) + ", " + CStr(Green) + ", " + CStr(Blue) 12 End Function

Prosedur diatas akan mendapatkan nilai RGB yang disimpan ke variabel Red, Green dan Blue (di baris 7, 8 dan 8). Data citra diambil dari kontrol PictureBox. GetPixel adalah fungsi API untuk mengambil data pixel, yang berjalan lebih cepat dibandingkan dengan fungsi standard PictureBox pict.Point(J, I).

82

VISUAL BASIC.NET

0 Private Function GetRGBFromPos(ByVal filename As String, ByVal Width As Integer, _ 1 ByVal Height As Integer) As String 2 Dim myBitmap As Bitmap = New Bitmap(filename) 3 4 If (Height > myBitmap.Height) Then Height = myBitmap.Height - 1 5 If (Width > myBitmap.Width) Then Width = myBitmap.Width - 1 6 7 Dim pixelColor As Color = myBitmap.GetPixel(Width, Height) 8 9 Return pixelColor.R.ToString() + ", " + pixelColor.G.ToString() + _ 10 ", " + pixelColor.B.ToString() 11 End Function

C#

0 private string GetRGBFromPos(string filename, int Width, int Height) 1 { 2 Bitmap myBitmap = new Bitmap(filename); 3 if (Height > myBitmap.Height) Height = myBitmap.Height-1; 4 if (Width > myBitmap.Width) Width = myBitmap.Width-1; 5 6 Color pixelColor = myBitmap.GetPixel(Width, Height); 7 8 return pixelColor.R.ToString() + ", " + pixelColor.G.ToString() + 9 ", " + pixelColor.B.ToString(); 10 }

Prosedur diatas (Visual Basic.Net dan C#) akan mendapatkan nilai RGB yang disimpan ke variabel Red, Green dan Blue (di baris 8). Data citra diambil dari file. Ukuran citra yang sebenarnya terdapat di variabel myBitmap.Height dan myBitmap.Width seperti di baris 3 dan 4.

Parameter filename (baris 0) adalah nama lengkap dari file citra, misalnya c:\gambar\gambar1.jpg untuk visual basic.net dan c:\\gambar\\gambar1.jpg, untuk c#.

83

JAVA

0 private String GetRGBFromPos(String filename, int x, int y) 1 { 2 int red =0, green=0, blue=0, color=0; 3 try 4 { 5 java.io.File file= new java.io.File(filename); 6 7 java.awt.image.BufferedImage image = 8 javax.imageio.ImageIO.read(file); 9 10 color = image.getRGB(x,y); 11 12 red = (color & 0x00ff0000) >> 16; 13 green = (color & 0x0000ff00) >> 8; 14 blue = color & 0x000000ff; 15 } 16 catch(Exception ex) { } 17 18 return String.valueOf(red) + ", " + String.valueOf(green) + 29 ", " + String.valueOf(blue); 30 }

Prosedur diatas akan mendapatkan nilai RGB yang disimpan ke variabel Red, Green dan Blue (di baris 12, 13 dan 14). Data citra diambil dari file. Parameter filename (baris 0) adalah nama lengkap dari file citra, misalnya c:\\gambar\\gambar1.jpg.

84

LAMPIRAN B TAMPILAN PROJECT

PROJECT TRANSFORMASI WARNA DI VISUAL BASIC 6

PROJECT TRANSFORMASI WARNA DI VISUAL BASIC.NET

85

PROJECT TRANSFORMASI WARNA DI C#

PROJECT TRANSFORMASI WARNA DI JAVA

Program-program diatas tersedia secara lengkap dalam CD yang disertakan di buku ini.

86

ERICKS RACHMAT SWEDIA, ST, MMSI

PERSONAL DATA Alamat : Pondok Bambu Kuning Blok B1/7, Bojonggede, Bogor. Telepon : 087878020802 Email : [email protected] Posisi : Wakil Kepala sub Bagian Pengembangan Sistem, Universitas Gunadarma

TEACHING EXPERIENCES Algoritma dan Pemrograman I, Universitas Gunadarma (2009) Konsep Data Mining, Universitas Gunadarma (2009) Pengantar Kecerdasan Buatan, Universitas Gunadarma (2010) Pengolahan Paralel, Universitas Gunadarma (2009) Sistem Basis Data I, Universitas Gunadarma (2009)

INTERNATIONAL CERTIFICATION 2005 Microsoft Certified Professional in Developing Windows Applications with Visual Basic.NET. 2005 Microsoft Certified Professional in Developing XML Web Services with Visual Basic.NET. 2005 Microsoft Certified Professional in Implementing and Designing SQL Server. 2005 Microsoft Certified Professional in Developing Web Applications with Visual Basic.NET. 2005 Microsoft Certified Applications Developer (MCAD.NET)

FORMAL EDUCATION 2005-2008 Master of Information System Management at Gunadarma University. Thesis : Design and Analysis Project Monitoring Control System at PT. Jalan Tol Seksi Empat Makassar. 1994-1999 Bachelor Degree at Gunadarma University, Faculty of Industry Technology, Department of Information Technique. Thesis : Designing and Programming The Deterministic Turing Machine Simulator

87

PROJECTS EXPERIENCE 2000 Developed Chief Election Application for KOPERTIS III Jakarta with Windows Socket (TCP/IP). Part of a team in developing Project Monitoring Information System for Departemen Dalam Negeri Indonesia. Part of a team in developing Investment Information System for Departemen Dalam Negeri Indonesia. Part of a team in developing Voucher System Application for IT Division PT. Bristol Myers Squibb Indonesia Tbk. 2001 Developed Exam Application for Gunadarma University. Part of a team in Analyze Technological and Professional Skill Development Project for Dirjen Pendidikan Tinggi (DIKTI) Indonesia. Developed Transcript Application and System for Gunadarma University. 2002 Developed Product Scheduler Application for PPIC Division PT. Bristol Myers Squibb Indonesia Tbk. Developed Task Remainder Application for PPIC Division PT. Bristol Myers Squibb Indonesia Tbk. Developed Asessment Result Application for Human Resource division, Departement Kehutanan Republik Indonesia. 2004 Developed Sales-Distributor Report Application for Sales Division PT. Nestle Indonesia. 2005 Developed Academic Application for Gunadarma University. Developed Radio Application and System for Megaswara Radio (Bogor, Serang, Sukabumi, Kuningan). 2006 Developed Malaysian Derivative Exchange Interpreter for Bernama with TCP/IP and Serial Communications (COMM). Developed Kuala Lumpur Stock Exchange Interpreter for Bernama with Serial Communications (COMM). Developed Unit Trust Web Application for Bernama. 2007 Developed Academic Application for Akademi Kebidanan Gunadarma University. Developed Chess Application for Gunadarma University. Developed Project Monitoring Control System for PT. Jalan Tol Seksi IV - Makassar. Developed Crude Oil Import Monitoring for Crude & Intermediate Procurement Department PT. Pertamina - Jakarta. 2009 Developed Report Management for MetroTV. 2010 Developed Oil Publication for PT. Pertamina - Jakarta.

I hereby certify that the information given above is true. Under any circumstances where misrepresentation or omission of information is found, I understand that I shall be fully responsible.

88

MARGI CAHYANTI, SKom, MMSI

PERSONAL DATA

Alamat : Pondok Bambu Kuning Blok B1/7, Bojonggede, Bogor. Telepon : 087878020820 Email : [email protected] Posisi : Kepala Bagian Ujian Mandiri, Universitas Gunadarma Alamat Kantor : Jl. Margonda Raya No. 100 Depok Telepon Kantor : 021-78881112 ext. 501

TEACHING EXPERIENCES

Algoritma Pemrograman I, STMIK Gunadarma (1993 - 1995) Pemrograman Pascal I, STMIK Gunadarma (1993 - 1995) Pengantar Komputer dan TI II, Universitas Gunadarma (2000 - 2002) Teknik Pemrograman Terstruktur I, Universitas Gunadarma (2006 - Now) Teknik Pemrograman Terstruktur II, Universitas Gunadarma (2006 - Now)

89