GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )

按按钮截图,图片保存在当前路径为“save.png”:

[cpp]  view plain copy
  1. #include <gtk/gtk.h>  
  2. #include <cairo.h>  
  3.   
  4. /******************************************************** 
  5. 功能:指定窗口区域截图,需要包含头文件cairo.h  
  6. 参数: 
  7.     area:       需要截图的窗口指针 
  8.     x, y, w, h: 截图的范围 
  9.     path_name:  保存图片的路径名字,如 "./image/test.png" 
  10. 返回值:截图的图片pixbuf,失败返回NULL 
  11. *********************************************************/  
  12. GdkPixbuf *screenshot(GtkWidget *area, int x, int y, int w, int h, char *path_name)  
  13. {  
  14.     GdkPixbuf *pixbuf = NULL;  
  15.     pixbuf = gdk_pixbuf_get_from_drawable(NULL, area->window, NULL,  
  16.             x, y, 0, 0, w, h);  //取到矩形区域图片  
  17.     if(NULL == pixbuf){ // 如果没有获取成功,结束函数  
  18.         printf("gdk_pixbuf_get_from_drawable failed\n");  
  19.         return  NULL;  
  20.     }  
  21.   
  22.     cairo_surface_t *surface = NULL;  
  23.     cairo_t *cr;  
  24.     // 创建一个 Cairo 外观   
  25.     surface = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32, w, h) ;  
  26.     // 一个 Cairo 环境  
  27.     cr = cairo_create( surface) ;   
  28.       
  29.     // 给cr绘图  
  30.     gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);  
  31.     cairo_paint(cr);  
  32.       
  33.     // 截图  
  34.     cairo_surface_write_to_png ( surface, path_name ) ;  
  35.       
  36.       
  37.     // 释放相应资源  
  38.     cairo_destroy(cr) ;  
  39.     cairo_surface_destroy( surface) ;  
  40.     //g_object_unref(pixbuf);  
  41.       
  42.     return pixbuf;  
  43. }         
  44.   
  45.   
  46.   
  47.   
  48. /* 功能:  设置背景图 
  49.  * widget: 主窗口 
  50.  * w, h:   图片的大小 
  51.  * path:  图片路径 
  52.  */  
  53. void chang_background(GtkWidget *widget, int w, int h, const gchar *path)  
  54. {  
  55.     gtk_widget_set_app_paintable(widget, TRUE);     //允许窗口可以绘图  
  56.     gtk_widget_realize(widget);   
  57.   
  58.     /* 更改背景图时,图片会重叠 
  59.      * 这时要手动调用下面的函数,让窗口绘图区域失效,产生窗口重绘制事件(即 expose 事件)。 
  60.      */  
  61.     gtk_widget_queue_draw(widget);  
  62.   
  63.     GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);   // 创建图片资源对象  
  64.     // w, h是指定图片的宽度和高度  
  65.     GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);  
  66.   
  67.     GdkPixmap *pixmap = NULL;  
  68.   
  69.     /* 创建pixmap图像;  
  70.      * NULL:不需要蒙版;  
  71.      * 123: 0~255,透明到不透明 
  72.      */  
  73.     gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);  
  74.     // 通过pixmap给widget设置一张背景图,最后一个参数必须为: FASLE  
  75.     gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);  
  76.   
  77.     // 释放资源  
  78.     g_object_unref(src_pixbuf);  
  79.     g_object_unref(dst_pixbuf);  
  80.     g_object_unref(pixmap);  
  81. }  
  82.   
  83. // 按钮"clicked"信号的处理函数  
  84. void deal_button(GtkWidget *w, gpointer data)  
  85. {  
  86.     // 截图,指定窗口区域为(0, 0, 300, 300),在当前路径保存图片为save.png  
  87.     screenshot(GTK_WIDGET(data), 0, 0, 300, 300, "save.png");  
  88. }  
  89.   
  90. int main( int argc, char *argv[])  
  91. {  
  92.     gtk_init(&argc, &argv);  
  93.   
  94.     //主窗口操作  
  95.     GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  96.   
  97.     gtk_window_set_title(GTK_WINDOW(window), "设置窗口背景图");  
  98.     gtk_widget_set_size_request(window, 500, 450);  
  99.   
  100.     chang_background(window, 500, 400, "image.jpg");    // 设置窗口背景图  
  101.       
  102.     GtkWidget *table = gtk_table_new(3, 3, TRUE);   // 表格布局,3行3列  
  103.     gtk_container_add(GTK_CONTAINER(window), table); // 容器加入窗口  
  104.   
  105.     // 截图按钮  
  106.     GtkWidget *button = gtk_button_new_with_label("截图");  
  107.     gtk_table_attach_defaults(GTK_TABLE(table), button, 2, 3, 2, 3);   
  108.     // 处理按钮的信号,把窗口指针window传给回调函数deal_button()  
  109.     g_signal_connect(button, "clicked", G_CALLBACK(deal_button), window);  
  110.       
  111.   
  112.     gtk_widget_show_all(window); // 显示所有部件  
  113.   
  114.     gtk_main();  
  115.       
  116.     return 0;  
  117. }  


程序运行效果图:

GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )_第1张图片


截出来的图片:



源代码下载请点此处。


你可能感兴趣的:(gtk)