标签:一步一步学习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; }
截出来的图片:
标签:一步一步学习gtk+ gtk进阶学习 截图
原文地址:http://blog.csdn.net/tennysonsky/article/details/43155393