Sabtu, 16 Januari 2016

Membuat Program Screenshot dengan C



Untuk dapat mengambil screenshot, program harus berkomunikasi dengan system atau display manager melalui API. Di Linux, hal ini dimungkinkan dengan library display manager yang disediakan oleh X. Namun cara ini kurang portabel, jadi sebagai alternatif kita bisa menggunakan library crossplatform GDK. Jika anda sudah pernah membuat program GTK, maka ini tidak akan sulit, karena GDK sendiri sangat erat hubungannya dengan GTK. Namun Jika belum, silahkan membaca tutorial Hello World GTK dahulu untuk menyiapkan library yang diperlukan.

Untuk dapat memahami bagaimana screenshot yang didemonstrasikan disini bekerja, anda harus mengetahui beberapa istilah baru yang digunakan dalam GDK dan X11:
  • Screen : yaitu layar penampil dimana seluruh window dan pointer mouse berada.
  • Window : Dalam sistem Linux Window dimanajemen secara hierarki, seperti halnya filesystem. Window yang menjadi pangkal dan merupakan parent dari window lain disebut sebagai root window. Semua region segiempat di desktop linux sebenarnya merupakan kumpulan dari window yang diatur tampilannya sedemikian rupa. Baik button, textbox, menu, semua itu merupakan window.
  • Pixbuf : Merupakan singkatan dari pixel buffer. Pixbuf bertugas menyimpan data gambar dalam memori. Data inilah yang bisa diambil dan diproses lebih lanjut.

Proes pengambilan screenshot yang ditunjukkan disini sangat sederhana. Pertama kita mencari tahu screen default yang sedang ditampilkan di monitor.

GdkScreen * gdk_screen_get_default (void);

Kemudian dilanjutkan dengan mengambil root window dari screen. Argumen untuk parameter screen diperoleh dari pemanggilan fungsi sebelumnya.

GdkWindow * gdk_screen_get_root_window (GdkScreen *screen);

Sebelum memperoleh pixbuf, kita harus mengetahui panjang(width) dan lebar(height) dari root window.

int gdk_window_get_width (GdkWindow *window);
int gdk_window_get_height (GdkWindow *window);

Semua window menyimpan tampilan gambarnya dalam pixbuf, jadi yang harus dilakukan sekarang adalah mengambil pixbuf dari root window tersebut.

GdkPixbuf * gdk_pixbuf_get_from_window (GdkWindow *window, gint src_x, gint src_y, gint width, gint height);

src_x dan src_y adalah parameter yang menentukan titik koordinat window yang akan diambil data pixbuf-nya. Sementara itu, width dan height adalah panjang dan lebar gambar yang diambil dari window, dihitung dari src_x dan src_y.

Terakhir, kita simpan data pixbuf tersebut ke dalam file sebagai gambar JPEG.

gboolean gdk_pixbuf_save (GdkPixbuf *pixbuf, const char *filename, const char *type, GError **error, ...);

Semua parameter prototype fungsi di atas agaknya cukup jelas, hanya ada beberapa yang masih harus dijelaskan. Parameter type menentukan format gambar yang akan disimpan; kita bisa memilih “BMP”, “PNG”, “JPEG”, “ICO”, atau yang lainnya. Parameter error digunakan untuk menunjukkan pesan error jika terjadi kesalahan, parameter ini bersifat opsional. Setiap type gambar memiliki karakteristik tersendiri. Untuk mengatur karakteristik ini, kita boleh menambahkan beberapa parameter opsional, seperti tingkat kualitas atau level kompresi gambar. Setelah itu semua, argumen 0 harus dikirim sebagai parameter paling terakhir.

Sebelum itu semua dilakukan, kita harus memanggil gtk_init() terebih dahulu. Fungsi ini akan menginisialisasikan library GDK, GTK dan beserta library dependensinya.

screenshot.c



#include <gtk/gtk.h>

int main(int argc, char *argv[]){
 GdkScreen *screen;
 GdkWindow *rootWindow;
 GdkPixbuf *rootWinPixbuf;
 int screenWidth, screenHeight; 
 
  gtk_init(&argc,&argv);
 screen = gdk_screen_get_default ();
 rootWindow = gdk_screen_get_root_window(screen);
 screenWidth = gdk_window_get_width(rootWindow);
 screenHeight = gdk_window_get_height(rootWindow);
 rootWinPixbuf = gdk_pixbuf_get_from_window(rootWindow,0,0,screenWidth, screenHeight);
 gdk_pixbuf_save(rootWinPixbuf,"/home/it/screenshot.jpg","jpeg",0,NULL);
 return 0;
}


Build dengan perintah berikut.
gcc screenshot.c `pkg-config --cflags --libs gtk+-3.0`

Selamat mencoba :)
Load disqus comments

0 comments