Bagaimana cara membuat sebuah selector grayscale-bitmap?
Kita tahu, bitmap adalah citra yang dihasilkan dari kumpulan pixel berwarna. Warna dari pixel ini berupakan perpaduan dari warna merah (R), hijau (G), dan biru (B). Intensitas yang berbeda untuk masing-masing komponen warna, ketika dicampur akan menghasilkan warna baru yang berbeda juga.
Masing-masing komponen warna memiliki intensitas dari 0 (nol) sampai 255. Sehingga jumlah warna yang berbeda yang bisa dibuat dengan mencampur komponen warna (R, G, dan B) adalah 24bit, atau setara dengan:
2^24 = 2^4 * 2^10 * 2^10 —> 2^10 = 1K = 1024
= 2^4 * K * K
= 16M
= 16.777.216 warna.
Sedangkan grayscale adalah bitmap yang komponen warnanya (R, G, B) memiliki besar yang setara/seimbang.
Contoh:
RGB(0, 0, 0) = putih.
RGB(127, 127, 127) = abu-abu dengan intensitas 50%.
RGB(191, 191, 191) = abu-abu dengan intensitas 75%.
RGB(255, 255, 255) = hitam.
Berdasarkan pengetahuan di atas, aku coba bikin sebuah selector grayscale-bitmap. Dipikir-pikir mungkin akan berguna dikemudian hari. Fungsinya bernama IsGrayscaleBitmap(APathFile: string) dan memiliki inner function IsPixelGray, dimana APathFile adalah filename beserta path dari bitmap file yang akan diperiksa. Return value IsGrayscaleBitmap akan True jika APathFile adalah grayscale bitmap, dan bernilai False jika sebaliknya. Fungsi ini sebenarnya memanfaatkan class yang sudah disediakan object pascal yaitu TBitmap dan TCanvas serta fungsi IntToHex untuk konversi bilangan integer ke hexadecimal.
Source code nya seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | function IsGrayscaleBitmap(AFilePath: string): Boolean; function IsPixelGray(AColor: TColor): Boolean; const HEX_DIGIT = 6; var colorInHex, parseColor: string; i: Integer; begin Result := True; colorInHex := IntToHex(AColor, HEX_DIGIT); { Ambil 2 huruf pertama dari colorInHex } parseColor := Copy(colorInHex, 1, 2); for i := 1 to (Length(colorInHex) div 2)-1 do begin { Ambil 2 huruf selanjutnya dan bandingkan dengan 2 huruf pertama } Result := Result and (Copy(colorInHex, 2*i+1, 2) = parseColor); { Jika tidak sama maka keluar, Result fungsi bernilai false } if not Result then Exit; end; end; var row, column: Integer; color: TColor; bitmap: TBitmap; begin Result := True; { Create buffer untuk bitmap file } bitmap := TBitmap.Create; try bitmap.LoadFromFile(AFilePath); { Memeriksa sebanyak width * height pixel } for row := 0 to bitmap.Width-1 do begin for column := 0 to bitmap.Height-1 do begin color := bitmap.Canvas.Pixels[row, column]; { Memeriksa apakah komponen warna pixel[row, column] memiliki nilai yang setara/seimbang/sama } Result := Result and IsPixelGray(color); { Jika ada salah satu pixel saja yang bukan grayscale maka keluar, dan Result dari fungsi adalah false } if not Result then Exit; end; end; finally bitmap.Free; end; end; |
Fungsi di atas sangat mungkin dimanfaatkan untuk hal yang berbeda. Silaken dimodifikasi sesuai kebutuhan.

Thursday, 20. May 2010
ini buat ngecek grayscale apa bukan yah pak??
Thursday, 20. May 2010
@hendri: iya .. itu fungsi untuk memeriksa apakah suatu file bitmap greyscale atau bukan.