Oke, ternyata tak sesulit yang saya sangka. Berkat referensi dari buku ini : Inside Delphi 2006. Secara sederhana menjelaskan kelas TBitmap yang memiliki properti object Canvas, dimana Canvas ini selanjutnya memiliki properti array pixels dan scanlines.
Dengan pixels, semua titik pada image dapat diakses menggunakan array dua dimensi. Mudah, namun sangat lambat. Ditunjukkan hanya sebagai pelengkap metode yang lebih baik dengan penggunaan scanlines.
Berikut screenshot aplikasi dengan gambar asli :
Dan setelah mendapat proses filter Invert, berikut hasilnya :
Berikut contoh penggunaan filter Invert (hanya 255 - nilai RGB saja) :
var
x,y : integer;
oldColor : TColor;
r,g,b : Integer;
begin
for y := 0 to pred(image.Height) do
begin
for x := 0 to pred(image.Width) do
begin
oldColor := image.Canvas.Pixels[x,y];
r := 255 - getrvalue(oldcolor);
g := 255 - getgvalue(oldcolor);
b := 255 - getbvalue(oldcolor);
image.Canvas.Pixels[x,y]:=rgb(r,g,b);
end;
end;
invalidate;
end;
Dengan scanlines, satu baris pada image dapat diakses secara langsung, namun dengan urutan nilai piksel yang terbalik, yaitu BGR. Sehingga urutan pada memory adalah sebagai berikut:
BGR|BGR|BGR|BGR|BGR|BGR|...
Buku Inside Delphi 2006 ini juga menyajikan tips praktis (tapi profesional) yang dapat menjadi brainstorming bagi saya yang telah lama tidak memegang Delphi (padahal menurut kronologis, Pascal adalah bahasa pemrograman yang ke-2 setelah GW Basic yang saya geluti di masa SMP-SMA). Hehe, jadi sering senyum2 sendiri pas koding : teringat masa lalu... :)
Satu tips yang saya kutip dari buku itu, adalah ini, Membuat Record Type dan array untuk kemudahan mengolah hasil dari scanlines, berikut :
type
TMyPixelDescriptor = record
Blue: Byte;
Green: Byte;
Red: Byte;
end;
PMyPixelArray = ^TMyPixelArray;
TMyPixelArray = array[0..32767] of TMyPixelDescriptor;
Yaitu, dipersiapkannya record berupa deretan tiga byte yang mencerminkan urutan dari BGR pada scanlines. Contoh filter invert tersebut di atas diubah menggunakan metode scanlines:
procedure TMainForm.InvertScanlinesClick(Sender: TObject);
var
x,y : integer;
p : pMyPixelArray;
begin
for y := 0 to pred(image.Height) do
begin
p := image.scanline[y];
for x := 0 to pred(image.Width) do
begin
with p[x] do
begin
Blue := 255 - Blue;
Green := 255 - Green;
Red := 255 - Red;
end;
end;
end;
invalidate;
Kecepatan pemrosesan antara pixels dan scanlines jauh berbeda. Menarik juga Image Processing di Delphi ini.
Well, dari sedikit test tentang image processing di Delphi ini (ini termasuk Pra Riset sebelum suatu bantuan Thesis tentang Image Processing dimulai), maka saya rasa algoritma yang diminta bisa segera diimplementasikan. Tentu, dengan diskusi yang intens tentang algoritma tersebut.
Semuanya ini saya lakukan untuk menghindari kesalahan, yang terjadi tentang bantuan Image Processing yang terdahulu. Saya tidak melakukan Pra Riset sebelum menerima DP, sehingga saat DP sudah diterima, hal tersebut menjadi Hutang yang harus segera dilunasi. Dan, well, kesalahan tersebut seharusnya tidak terulang lagi.
Semoga bermanfaat!
NB:
- Saya merasakan, Delphi bisa menjadi salah satu investasi pembelajaran software yang cukup berharga.
- Dengan ini, maka saya rasa mainstream bahasa pemrograman yang kurang saya seriusi, sudah mulai saya biasakan. Ya, Delphi ini maksudnya :)
- Masih Pra-Riset, sehingga belum juga bisa dikatakan bantuan Thesis ini akan saya terima. Hanya, fondasinya sudah jelas dengan kode. Bukan dengan gambaran kasar tentang teori.
- Itu bedanya.
1 comment:
I think important info
Get More Details
Post a Comment