Tuesday, October 23rd, 2007 | Author: Riza

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.

Tulisan yang mungkin berkaitan dengan tulisan di atas:

  1. Cara Mendapatkan MAC Address
  2. Manager Class

Category: Delphi
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

2 Responses

  1. 1
    Hendri bewok 
    Thursday, 20. May 2010

    ini buat ngecek grayscale apa bukan yah pak??

  2. @hendri: iya .. itu fungsi untuk memeriksa apakah suatu file bitmap greyscale atau bukan.

Leave a Reply » Log in


Verification: