首页 > 其他分享 >GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )

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

时间:2022-09-28 18:08:26浏览次数:56  
标签:截图 GTK 进阶 gtk pixbuf widget window NULL


按按钮截图,图片保存在当前路径为“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实现截图功能( 可以指定截图范围 )_GTK进阶学习


截出来的图片:

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



标签:截图,GTK,进阶,gtk,pixbuf,widget,window,NULL
From: https://blog.51cto.com/u_3002289/5720682

相关文章

  • GTK常用控件之图片控件( GtkImage )
    图片控件和标签的作用很类似,都是作为显示用的,只是图片控件显示的内容是图片。图片控件的创建:GtkWidget*gtk_image_new_from_file(constgchar*filename);filename:图片的......
  • Snipaste,一个比QQ截图好用一万倍的截图神器!
    摘自:https://baijiahao.baidu.com/s?id=1654041827952660862&wfr=spider&for=pc软件下载:https://www.snipaste.com/download.html今天要向大家介绍的这款利器,名字叫......
  • 在Python使用Win32api接口实现后台截图
    1#对后台窗口截图2importwin32gui,win32ui,win32con3importcv24importnumpyasnp56#获取后台窗口的句柄,注意后台窗口不能最小化7hWnd=win32......
  • MakeFile编写深入进阶
    make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,VisualC++的nmake,Linux下GNU的make。Makefile里有什么?Mak......
  • C++学习之指针进阶(转载)
    1指针和数组作用:利用指针访问数组中元素示例:intarr[]={1,2,3,4,5,6,7,8,9,10};int*p=arr;//指向数组的指针cout<<"第一个元素:"<<arr[0]<<endl;......
  • python进阶之路5
    作业讲解1.获取用户输入并打印成下列格式 ------------infoofJason-----------Name:JasonAge:18Sex:maleJob:Teacher-------......
  • 前端面试总结06-异步进阶
    1.事件循环(1:JS是单线程运行的(2:异步要基于回调来实现(3:eventloop就是异步回调的实现原理2.JS如何执行从前到后一行一行执行如果某一行执行报错,则停止下面代码的执行......
  • vue(7)v-model进阶使用
    序简单讲解v-model双向数据绑定的使用,过于简单就不写描述啦,看代码,工具是HBuilderX示例<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title></ti......
  • Java 进阶
    Java进阶1.数组1.1数组的创建注意:new是在堆中创建一个数组或者在堆中分配一块连续的存储空间,把这块空间的引用赋值给数组名还有需要注意的是,数组定义了之后,系统会给......
  • python进阶之路4
    内容回顾PEP8规范代码编写规范及美观python注释语法平时养成写注释的习惯 1.警号 2.三个单引号 3.三个双引号常量与变量1.变量语法结构 变量名......