1、用到的库主要是

GDK的函数库  http://library.gnome.org/devel/gdk/stable/

cairo库  http://cairographics.org/documentation/

GTK+

底层自己也就是用的cairo了。

基本的绘图 点,线、弧 、多变形都可以在上面说的两个库里面找到

比如

gdk_draw_line    等函数。。。

2、GdkPixbuf  就是一个Bitmap 的封装类,很多绘图操作都要通过它,

(1)

从文件加载 png jpeg或者bmp图形。比较好的是支持多种格式的。

GdkPixbuf *  widebright_png =

gdk_pixbuf_new_from_file ("widebright.png",&error);

保存到文件

gdk_pixbuf_save(pixbuf, "screenshot.jpg", "jpeg", NULL, "quality",

"100",NULL);

(2) 把 GdkPixbuf 里面图形信息绘制到显示窗体,

gdk_draw_pixbuf

((GdkDrawable *) gdk_window,

gc,

pixbuf,

0,

0,

0,

0,

w,

h,

GDK_RGB_DITHER_NONE                         ,

1,

1);

(3) 获取窗体上面的

图形到GdkPixbuf

GdkPixbuf * pixbuf =

gdk_pixbuf_get_from_drawable(NULL, root_window, NULL,

0, 0, 0, 0, w, h); // 抓图

3、GtkWindow 到 GdkWindow 。因为图形操作都是通过

GdkWindow 来进行的,所以经常要从Gtk控件的到它的GdkWindow,才能进行绘图操作。

其实就是通过GtkWidget结构的

window成员

GdkWindow * gdk_window =GTK_WIDGET(

window)->window;

4。 抓屏

这个很简单,获取到root窗体的

GdkWindow 就可以用上面的办法来操作了。

GdkScreen *screen =

gdk_screen_get_default();

//GdkWindow * rootWindow

=gdk_screen_get_root_window(screen);

GdkWindow * root_window =

gdk_get_default_root_window (); //这个和上面那个函数一样的

if (!root_window )

{

return TRUE;

}

int w = gdk_screen_get_width(screen);

int

h = gdk_screen_get_height(screen);

5。 绘制

可以自己处理

expose_event signal消息, 其实就相当于 windows平台的WM_PAINT消息

如果在其他地方绘制图形,又想有后台缓

存的话,可以调用这两个函数

gdk_window_begin_paint_rect ((GdkDrawable

*)gdk_window,&rect);

gdk_window_end_paint ((GdkDrawable

*)gdk_window);

6、cairo 库绘制的话也很方便

直接使用 gdk_cairo_create 来从

GdkWindow来得到一个 cairo_t 绘图环境就可以画图了,

cairo_t *

gdk_cairo_create                    (GdkDrawable *drawable);

void

gdk_cairo_set_source_color          (cairo_t *cr,

const GdkColor *color);

void

gdk_cairo_set_source_pixbuf         (cairo_t *cr,

const GdkPixbuf *pixbuf,

double pixbuf_x,

gdk_cairo_set_source_pixbuf

可以把GdkPixbuf 里面图形传到 cairo绘图表面上去。

cairo有趣的地方是他可以设置 mask 蒙版,还有 “线性渐变”

“径状辐射渐变”等,可以产生半透明的模糊效果了。

不过的东西,蒙版也都是不错的。 还可以方便的设置 alpha通道进行半透明绘制等。

面的是乱七八糟的一个例子,看懂了一般的绘图都不成问题了,哈哈,忘记了的时候还可以来看一下。

===========================================

GdkWindow * gdk_window = window->window;

// GdkScreen

*screen1 = gdk_screen_get_default();

// GdkColormap *

colormap = gdk_screen_get_rgba_colormap(screen1);

//

gtk_widget_set_colormap(window, colormap);

cairo_t *cr2  =

gdk_cairo_create(gdk_window);

//gdk_pixbuf_new_from_file方法 才能保存

alpha通道的透明信息,

//cairo_image_surface_create_from_png 好像不行

GError *

error =NULL;

GdkPixbuf *  widebright_png = gdk_pixbuf_new_from_file

("widebright.png",&error);

cairo_surface_t *image =

cairo_image_surface_create_from_png("Screenshot.png");             //

cairo函数读取png文件

cairo_surface_t *icon =

cairo_image_surface_create_from_png("widebrigh.png");             //

cairo函数读取png文件

cairo_t *cr = cairo_create(image);

///默认是CAIRO_OPERATOR_OVER    draw source layer on top of destination

layer (bounded)

cairo_set_operator(cr,

CAIRO_OPERATOR_SOURCE);       //replace destination layer (bounded)

cairo_set_operator(cr2, CAIRO_OPERATOR_SOURCE);       //replace

destination layer (bounded)

cairo_pattern_t *linpat,

*radpat;

linpat = cairo_pattern_create_linear (0, 0, 0, 100);

cairo_pattern_add_color_stop_rgb

(linpat, 0, 0, 0.8, 0.8);

cairo_pattern_add_color_stop_rgb (linpat,

100, 0.8, 0.8, 0.0);

radpat = cairo_pattern_create_radial

(100,100, 0, 100, 100, 100);

cairo_pattern_add_color_stop_rgba

(radpat, 0, 0, 0, 0, 1);

cairo_pattern_add_color_stop_rgba (radpat,

100, 0, 0, 0, 0);

//cairo_set_source (cr, linpat);

GdkGC

*  gc = gdk_gc_new ( (GdkDrawable *) gdk_window);

if (!gc)   {

gtk_label_set_text(label_message,"error");

return TRUE;

}

GdkColor

color;

color.red = 0;

color.green = 0;

color.blue = 30000;

gdk_gc_set_rgb_bg_color(gc , &color);

gdk_gc_set_rgb_fg_color(gc

, &color);

GdkScreen *screen = gdk_screen_get_default();

//GdkWindow

* rootWindow =gdk_screen_get_root_window(screen);

GdkWindow *

root_window = gdk_get_default_root_window (); //这个和上面那个函数一样的

if

(!root_window )

{

return TRUE;

}

int w =

gdk_screen_get_width(screen);

int h =

gdk_screen_get_height(screen);

GdkPixbuf * pixbuf =

gdk_pixbuf_get_from_drawable(NULL, root_window, NULL,

0, 0, 0, 0, w, h); // 抓图

//gdk_pixbuf_save(pixbuf, "screenshot.jpg",

"jpeg", NULL, "quality", "100",

//

NULL);      // 将图片存为jpg格式

GdkRectangle rect;

rect.x =0;

rect.y

=0;

rect.width = w;

rect.height =h;

//文档说调用这个会准备好后台缓冲区,绘图时不闪烁。

gdk_window_end_paint后图形就一次性显示

//不调用这个绘图时就一步一步的来,马上显示在屏幕上

//gdk_window_begin_paint_rect

((GdkDrawable *)gdk_window,&rect);

/*

typedef

enum

{

GDK_RGB_DITHER_NONE,

GDK_RGB_DITHER_NORMAL,

GDK_RGB_DITHER_MAX

} GdkRgbDither;

*/

//直接调用

gdk_draw_drawable () 从 root_window 到 gdk_window的复制不行,

//可能需要转换成RGB(A)

放到GdkPixbuf 里面才行吧

/*

gdk_draw_pixbuf ((GdkDrawable *)

gdk_window,

gc,

pixbuf,

0,

0,

0,

0,

w,

h,

GDK_RGB_DITHER_NONE                         ,

1,

1);

*/

gdk_cairo_set_source_pixbuf(cr

,pixbuf,0,0);

cairo_paint_with_alpha (cr, 0.65);

gdk_cairo_set_source_pixbuf(cr

,widebright_png,0,0);

cairo_paint_with_alpha (cr, 0.5);

cairo_mask

(cr, radpat);

cairo_set_source_surface(cr2,

image, 0, 0);

cairo_paint(cr2);

cairo_destroy(cr2);

cairo_destroy(cr);

g_object_unref(pixbuf);     //

pixbuf是gdk_pixbuf_get_from_drawable新创建的,要释放

//gdk_draw_rectangle((GdkDrawable

*) gdk_window, gc ,

//                TRUE , 0 , 0 ,

//

500 ,

//               500);

//gdk_window_end_paint

((GdkDrawable *)gdk_window);

//gdk_window_invalidate_rect

(gdk_window,&rect,FALSE);

//gdk_window_clear (gdk_window);

g_object_unref(gc);

return TRUE;

========================================

面代码 绘制出来的就是半透明 的图形叠加等效果了,像下面这样。

阅读(1510) | 评论(0) | 转发(0) |

Linux第7章Gdk及Cairo基础,GNOME 平台的2D图形编程(GTK,GDK,Cairo...) 简介 [转]...相关推荐

  1. GNOME 平台的2D图形编程(GTK,GDK,Cairo...) 简介 [转]

    1.用到的库主要是 GDK的函数库  http://library.gnome.org/devel/gdk/stable/ 和 cairo库  http://cairographics.org/doc ...

  2. 新一代医院信息系统(NGHIS)设计(2)——基础集成平台(I)

    一.背景介绍 基础集成平台是信息系统的基础设施环境,为各应用系统提供公共基础设施(如ESB.消息中间件等),将各系统的通用基础服务功能(如用户管理.授权管理.配置管理等)从业务系统剥离出来,使得业务系 ...

  3. 从零开始的linux 第五章

    从零开始的linux 第五章 (咚咚咚...)路人甲:"小编!!快起床!!今天该讲课啦!" (迷迷糊糊且衣冠不整的小编去开门) 路人甲:"小...小编大人...你都让我这 ...

  4. linux 重定向_Linux视频教程分享,零基础在家你也可以学的会

    在IT行业,可以说Linux系统已经渗入到各个角落,无论是从事什么语言的编程人员,对Linux应该都要有所了解.下面,千锋小编就为大家分享Linux资料帮助新手快速入门. 主要介绍了Linux系统的详 ...

  5. linux怎么显示第三个数据,从零开始的linux 第三章

    从零开始的linux 第三章 同学们~起床咯~~(小编拿着喇叭在宿舍楼下喊道) 美好的一天从...从赞小编的博客开始~~ (↓看见小编的同学们) 什么!?你们对着可爱的小编说什么!?再说一遍!!? 同 ...

  6. 自学golang【第一章:go语言基础知识】为什么要学习go语言?go语言与c语言的关系?go语言创始人?go语言的特性有哪些?go语言适合做什么?国内外有哪些企业或项目使用go语言?

    事先声明:本文部分内容参考了尹成的笔记,如果侵权请联系删除. 我是一名自学go语言的初学者,从今天开始我将会坚持更新go语言的相关知识,从入门到精通,如果大家有什么需要可以加我QQ:239479969 ...

  7. 并发编程基础篇——第一章(并发相关基础概念理解)

    其实讲到并发编程,有时候会问自己为什么要去做这些知识的积累和沉淀,可能我们做业务的在职业生涯里,并不会经常使用到这些所谓的多线程编程,顶多可能开一个线程,去执行个任务,又或者通过定时器触发某个业务,实 ...

  8. 中职计算机应用基础每章知识点,[定稿]中职计算机应用基础教案_1-5章V3.1

    <[定稿]中职计算机应用基础教案_1-5章.doc>由会员分享,可免费在线阅读全文,更多与<[定稿]中职计算机应用基础教案_1-5章(V3.1)>相关文档资源请在帮帮文库(ww ...

  9. 《JavaScript高效图形编程(修订版)》——第2章 DHTML基础 2.1创建DHTML sprite

    本节书摘来自异步社区<JavaScript高效图形编程(修订版)>一书中的第2章,第2.1节,作者:[美]Raffaele Cecco著,更多章节内容可以访问云栖社区"异步社区& ...

  10. 第一章c语言基础知识答案,第一章 C语言的基础知识练习题

    第一章 C语言的基础知识练习题 第一章 C语言的基础知识 第一节 对C语言的初步认识 习题 1. 下列叙述中错误的是 B A)任何一个C程序都必须有且仅有一个main函数,C语言总是从main函数开始 ...

最新文章

  1. AI独角兽增援抗疫拉锯战,旷视守“城”,依图出“机”
  2. wireshark协议解析器原理与插件编写
  3. anaconda2-keras安装;keras后端修改
  4. VMware-使用VMware在本地搭建多个CentOS虚机
  5. bug death march
  6. html css 画五角星,纯 CSS3 绘制图形(心形、五角星、六边形等)
  7. ant build.xml文件中能使用的属性介绍
  8. hive分区用2个字段有何限制_[特性]Hive动态分区功能使用
  9. PHP入门及服务环境配置(Nginx+PHP)
  10. 华为Mate10到底AI在哪?
  11. Qt之利用事件过滤器在QLabel上画框
  12. Android4.4深入浅出之SurfaceFlinger总体结构
  13. CTEX编译Xelatex以及如何更新Miktex
  14. 深度解读德勤RPA2020年市场调研报告
  15. Tool-X 工具汇总
  16. 宝莱坞机器人 西瓜_《宝莱坞机器人之恋》电影完整版免费在线观看_2010西瓜影音 - 辛集电影院...
  17. 【总结】最好的CV学习小组,超200个课时+10个方向+30个项目,从理论到实践全部系统掌握...
  18. cuteftp向服务器传输文件没有权限
  19. FTP服务器-vsftpd
  20. Spring面试常问

热门文章

  1. 电脑计算机无法找到脚本文件夹,电脑开机老是提醒无法找到脚本文件的处理方法...
  2. 微信/钉钉电脑端登录后手机端不再提醒
  3. vue开发当中移动端中css常用相对单位
  4. 分清cols和rows,x与y,以及width和height的关系
  5. VS Code格式化代码插件Beautify
  6. 如何用html语言制作圆角矩形,webGL中圆角矩形的绘制
  7. React.js基础知识总结一
  8. 快速上手 Android 蓝牙串口 SPP 开发
  9. 如何实现一个去中心化的 Dropbox 存储
  10. C语言 求100--200之间的素数