Minggu, 22 Mei 2011

Capture Gambar Desktop

Atau, yang biasa disebut screen capture. Di Delphi, agar tidak menurunkan kualitas gambar hasil capture/snapshot, biasanya digunakakn TBitmap untuk menampung hasilnya. Nanti baru diubah ke format gambar lain yang diinginkan.

Tiap-tiap window di Windows memiliki handlenya sendiri, berupa bilangan bulat bertipe Dword (4 byte). Dekstop pun adalah sebuah window. Bila kita mengetahui handle sebuah window, kita dapat mengambil device context-nya (DC) berupa sebuah handle lain bertipe HDC (Handle of Device Context). Dari handle DC inilah, kita dapat mengcopy isi DC tersebut ke Bitmap.

Delphi mempermudah kita mengakses dan mengelola DC dengan sebuah class bernama TCanvas. Di atas TCanvas ini kita dapat menggambar, membuat teks, membuat efek-efek visual, ataupun menyalin dari dan ke Canvas lain.

Berikut potongan kode untuk mengambil handle window Desktop, mengambil handle DC (HDC)-nya dan mengcopynya ke TBitmap, dan menampilkannya pada sebuah TImage di atas Form.

01 function TFMain.SnapDesktop: TBitmap;
02 var
03 DC: TCanvas;
04 HDesk: THandle;
05 HCanvas: HDC;
06 w, h: integer;
07 begin
08 HDesk := GetDesktopWindow;
09 RefreshDesktop;
10 DC:= TCanvas.Create;
11 Result := TBitmap.Create;
12 try
13 dc.Handle := GetWindowDC(hdesk);
14 w := Screen.Width;
15 h := Screen.Height;
16 Result.Width := w;
17 Result.Height := h;
18 BitBlt(Result.Canvas.Handle, 0,0,w, h, dc.Handle, 0, 0, SRCCOPY);
19 finally
20 DC.Free;
21 end;
22 end;

Pada kode di atas, kita temui beberapa fungsi:

GetDesktopWindow() untuk mengambil handle desktop Windows.
GetWindowDC(handleWindow) untuk mengambil handle device context, dalam hal ini desktop Windows.
BitBlt() untuk mengcopy isi sebuah device context (DC) ke device context lainnya. Dalam contoh di atas, mengcopy dari DC desktop ke DC Bitmap.

Fungsi SnapDesktop di atas mengembalikan sebuah instance Bitmap yang kemudian dapat ditampilkan ke TImage, di-save ke file, atau diubah ke format gambar lainnya. Dalam contoh ini, Bitmap diubah ke gambar JPG (TJPEGImage) dengan kode berikut:

1 jpg := TJPEGImage.Create;
2 try
3 jpg.Assign(VariabelBitmap);
4 jpg.SaveToFile(NamaFile);
5 finally
6 jpg.Free;
7 end;

Dalam contoh kode yang tersedia untuk didownload, juga tersedia sebuah fungsi untuk memotong gambar sehingga hanya bagian tertentu saja yang diambil.

Berikut tampilan contoh aplikasi:

WinSnap_delphi_snapshot_screen_captureWinSnap_startup_windows



Download

Silahkan download WinSnap:

WinSnap Binary – 730KB
WinSnap Binary (7Zipped) – 280KB
WinSnap Source (7Zipped) – 20KB

UPDATE:

WinSnap Binary + Source (7Zipped)
– 300KB. Telah ditambahkan fungsi snap window tertentu.