<cite id="hhjmr"></cite>

        千鋒教育-做有情懷、有良心、有品質的IT職業教育機構

        400-811-9990
        當前位置:首頁  >  關于學院  >  技術論壇  >  正文

        GTK進階學習之GTK實現截圖功能

        時間:2019-07-31 10:39     來源:千鋒教育 作者:小鋒
        分享: 更多

          對于一個繪圖工具來說,截取圖片也是能夠做到的。

          按按鈕截圖,圖片保存在當前路徑為“save.png”:

          具體實現如下:

          #include

          #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;

          }

          實現效果圖如下:

        1

        相關文章

        • 北京總部地址:北京市海淀區寶盛北里西區28號中關村智誠科創大廈4層
          北京沙河校區:北京市昌平區沙陽路18號北京科技職業技術學院廣場服務樓
          咨詢電話:400-811-9990
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、Linux云計算+網絡安全培訓、互聯網營銷培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 深圳校區地址:深圳市寶安區寶安大道5010號西部硅谷B座A區6層A605/B座C區1層108
          咨詢電話:0755-23015275/23015546-801/86660670
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、Linux云計算+網絡安全培訓、互聯網營銷培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 上海校區地址:上海市寶山區同濟支路199號智慧七立方3號樓2-4層
          咨詢電話:400-811-9990 021-65233829-609
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、Linux云計算+網絡安全培訓、互聯網營銷培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 鄭州二七區校區地址:鄭州市二七區航海中路60號海為科技園C區10層
          鄭州高新區校區地址:鄭州市高新區金梭路與銀杏路交叉口教育科技產業園南門D座4層
          咨詢電話:0371-55191750/18610973027
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 廣州校區地址:廣州市天河區元崗路200號慧通產業園B9三層
          咨詢電話:020-87088521
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 大連校區地址:遼寧省大連市高新園區愛賢街10號大連設計城A座901
          咨詢電話:400-811-9990
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 武漢金融港校區地址:武漢市東湖高新技術開發區光谷大道77號金融港B18棟3樓
          武漢智慧園校區地址:武漢市東湖高新技術開發區光谷大道61號智慧園21棟2樓
          咨詢電話:027-59313371
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 成都校區地址:成都市武侯區科華北路62號力寶大廈N(北樓)16樓
          咨詢電話:18628039301/18280029283/13028173481/18613201237
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 西安校區地址:西安市雁塔區高新六路52號立人科技C座西區4樓
          咨詢電話:029-85363390
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 杭州旺田校區:浙江省杭州市江干區九堡旺田書畫城A座4層
          杭州龍馳校區:浙江省杭州市下沙經濟技術開發區元成路199號龍馳智慧谷B座7層
          咨詢電話:400-811-9990 0571-86893632/0571-86094032
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 青島校區地址:青島市市北區龍城路卓越世紀中心3號樓8層801
          咨詢電話:0532-80911190
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 重慶校區地址:重慶市高新區科園一路2號大西洋國際12-1
          咨詢電話:400-811-9990 023-68883009
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 長沙校區地址:湖南省長沙市岳麓區麓谷企業廣場A2棟三單元306號
          咨詢電話:0731-85513210
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 哈爾濱校區地址:哈爾濱市松北區世澤路689號科技創新城4號樓11樓
          咨詢電話:400-811-9990/0451-87173191
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 南京校區地址:南京市建鄴區應天大街780號弘輝產業園1棟2層
          咨詢電話:400-811-9990
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 太原校區地址:太原市小店區長治路230號能源互聯網大廈6層
          咨詢電話:400-811-9990 16603513433
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 沈陽校區地址:遼寧省沈陽市渾南區世紀路16號東大軟件園B園B1座A201
          咨詢電話:400-811-9990
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 合肥校區地址:合肥市包河區徽州大道396號東方廣場B座12A
          咨詢電話:400-811-9990
          面授課程:HTML5大前端培訓、JavaEE+分布式開發培訓、Python全棧+人工智能培訓、全鏈路UI/UE設計培訓、云計算培訓、全棧軟件測試培訓、大數據+人工智能培訓、智能物聯網+嵌入式培訓、Unity游戲開發培訓、Go語言開發培訓、PHP全棧+服務器集群培訓、網絡安全培訓、互聯網營銷培訓、好程序員
          認證課程:軟考、Adobe認證、PMP認證、紅帽RHCE認證
        • 千鋒教育服務號

          了解千鋒動態
          關注千鋒教育服務號

        • 千鋒教育移動站

          掃一掃快速進入
          千鋒移動端頁面

        • 千鋒互聯服務號

          掃碼匿名提建議
          直達CEO信箱

        久草在线免费视频在线观看