小小千想和您聊一聊

当前位置: 首页> 技术分享> GTK进阶学习:GTK实现截图功能

GTK进阶学习:GTK实现截图功能

  对于一个绘图工具来说,能够截取图片也是能够做到的。

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

  具体实现如下:

#include <gtk/gtk.h>  
#include <cairo.h>  
  
/******************************************************** 
功能:指定窗口区域截图,需要包含头文件cairo.h  
参数: 
    area:       需要截图的窗口指针 
    x, y, w, h: 截图的范围 
    path_name:  保存图片的路径名字,如 "./image/test.png" 
返回值:截图的图片pixbuf,失败返回NULL 
*********************************************************/  
GdkPixbuf *screenshot(GtkWidget *area, int x, int y, int w, int h, char *path_name)  
{  
    GdkPixbuf *pixbuf = NULL;  
    pixbuf = gdk_pixbuf_get_from_drawable(NULL, area->window, NULL,  
            x, y, 0, 0, w, h);  //取到矩形区域图片  
    if(NULL == pixbuf){ // 如果没有获取成功,结束函数  
        printf("gdk_pixbuf_get_from_drawable failed\n");  
        return  NULL;  
    }  
    cairo_surface_t *surface = NULL;  
    cairo_t *cr;  
    // 创建一个 Cairo 外观   
    surface = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32, w, h) ;  
    // 一个 Cairo 环境  
    cr = cairo_create( surface) ;   
    // 给cr绘图  
    gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);  
    cairo_paint(cr);  
    // 截图  
    cairo_surface_write_to_png ( surface, path_name ) ;  
    // 释放相应资源  
    cairo_destroy(cr) ;  
    cairo_surface_destroy( surface) ;  
    //g_object_unref(pixbuf);  
    return pixbuf;  
}         
/* 功能:  设置背景图 
 * widget: 主窗口 
 * w, h:   图片的大小 
 * path:  图片路径 
 */  
void chang_background(GtkWidget *widget, int w, int h, const gchar *path)  
{  
    gtk_widget_set_app_paintable(widget, TRUE);     //允许窗口可以绘图  
    gtk_widget_realize(widget);   
  
    /* 更改背景图时,图片会重叠 
     * 这时要手动调用下面的函数,让窗口绘图区域失效,产生窗口重绘制事件(即 expose 事件)。 
     */  
    gtk_widget_queue_draw(widget);  
  
    GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);   // 创建图片资源对象  
    // w, h是指定图片的宽度和高度  
    GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);  
  
    GdkPixmap *pixmap = NULL;  
  
    /* 创建pixmap图像;  
     * NULL:不需要蒙版;  
     * 123: 0~255,透明到不透明 
     */  
    gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);  
    // 通过pixmap给widget设置一张背景图,最后一个参数必须为: FASLE  
    gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);  
  
    // 释放资源  
    g_object_unref(src_pixbuf);  
    g_object_unref(dst_pixbuf);  
    g_object_unref(pixmap);  
}  
// 按钮"clicked"信号的处理函数  
void deal_button(GtkWidget *w, gpointer data)  
{  
    // 截图,指定窗口区域为(0, 0, 300, 300),在当前路径保存图片为save.png  
    screenshot(GTK_WIDGET(data), 0, 0, 300, 300, "save.png");  
}  
int main( int argc, char *argv[])  
{  
    gtk_init(&argc, &argv);  
  
    //主窗口操作  
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  
    gtk_window_set_title(GTK_WINDOW(window), "设置窗口背景图");  
    gtk_widget_set_size_request(window, 500, 450);  
  
    chang_background(window, 500, 400, "image.jpg");    // 设置窗口背景图  
      
    GtkWidget *table = gtk_table_new(3, 3, TRUE);   // 表格布局,3行3列  
    gtk_container_add(GTK_CONTAINER(window), table); // 容器加入窗口  
  
    // 截图按钮  
    GtkWidget *button = gtk_button_new_with_label("截图");  
    gtk_table_attach_defaults(GTK_TABLE(table), button, 2, 3, 2, 3);   
    // 处理按钮的信号,把窗口指针window传给回调函数deal_button()  
    g_signal_connect(button, "clicked", G_CALLBACK(deal_button), window);  
     
    gtk_widget_show_all(window); // 显示所有部件  
    gtk_main();  
     return 0;  
}  

  实现效果图如下:

上一篇:HTML5工具初识之网页编辑器

下一篇:PS教程:打造低多边形风格图像

QQ技术交流群

千锋物联网官方①群
858310440

加入群聊