Showing posts with label Programming::Delphi. Show all posts
Showing posts with label Programming::Delphi. Show all posts

Monday, July 27, 2009

Pra Riset Image Processing dengan Delphi


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) :
procedure TMainForm.Invert1Click(Sender: TObject);
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.

Thursday, July 23, 2009

Menggunakan ShellExec di Dalam Delphi untuk Membuat Aplikasi Launcher Java


Ini lanjutan dari artikel sebelumnya, yaitu saya ingin membuat lingkungan penggunaan software Java yang transparan (dimana user tidak melihat bedanya dengan lingkungan pengembangan yang lain, spt Delphi). Launcher ini dimaksudkan supaya user bisa menjalankan aplikasi java dengan klik 2x di desktop, itu gampangannya.

Mudah? Tidak juga. Beberapa produk free atau komersial ada di pasaran. Tapi terlalu rumit deh. Yang diinginkan hanyalah supaya aplikasi java, yang didistribusikan via file Jar bisa dijalankan dengan klik 2x. Caranya? Akhirnya begini saja.

  1. Gunakan ant + build.xml dari Netbeans. Coba buka proyek apa saja di Netbeans. Maka ia akan membuatkan file build.xml yang akan dijalankan oleh ant dengan perintah ant run. Nah, inilah perintah yang akan dijalankan oleh program Delphi.
  2. Gunakan fungsi ShellExec pada API Win 32 untuk menjalankan program eksternal, berikut kodenya :

    ShellExecute(Form1.WindowHandle,'','D:\Program\ant\bin\ant.bat','run','D:\-=SHARED=-\java\Platform',0);

    parameter yg penting adalah alamat lengkap file ant.bat, argumen run, lokasi build.xml proyek yang akan dijalankan dan terakhir argumen 0 agar window dari dos prompt tidak ditampilkan. Disini alamat direktori saya hardcode, tentunya nanti bisa dibuat dinamis agar sesuai dengan lokasi tempat aplikasi diinstal.
  3. Aplikasi delphi tersebut jadikan splashscreen saja. Berikut kodenya, pada file Project Delphi:
Application.Initialize;
form1 := TForm1.Create(Application);
form1.Show;
form1.Update;
Sleep(1000);
form1.run; // di method ini ada pemanggilan fungsi ShellExec
form1.Close;


Terakhir, jangan lupa buatkan shortcut ke file EXE dari splash screen tersebut.

Bagus hasilnya.
Semoga bermanfaat!

NB :
  • Meski, kata2 sy tentang aplikasi Java yang tidak bisa dibedakan dengan lingkungan pengembangan lain spt Delphi, saya rasa kurang tepat. Bagaimanapun juga, GUI Swing ada jeda atau lag yang agak terlihat. Sy pakai Pentium 4, masih terasa. Pernah juga AMD Turion 64 X2, tetep aja terasa. Juga stylnya masih terlihat Java bgt.
  • Kalau Eclipse RCP dengan SWT-nya tidak masalah. Benar2 native. jadi cepat. secepat aplikasi windows native.
  • Oya, benernya saya install Delphi karena ada yg minta bantuan untuk pengembangan Thesis. Eh, malah idenya jd kesini.
  • Saya sempatkan koding untuk pengembangan skill (dan bisnis), di luar kewajiban pengembangan aplikasi untuk skripsi/thesis yang sudah dipesan temen2.