当前位置: 首页 > 知识库问答 >
问题:

用Cairo绘制GTK图形的效率

宋劲
2023-03-14

所以,我想用PyCairo绘制一个图像。效率非常重要,但我使用PyGtk的gtk.gdk.Pixbuf加载图像。我的问题是,通过gtk.gdk检索开罗上下文来呈现Pixbuf是否有性能差异。CairoContext与将Pixbuf转换为cairo的对比。ImageSurface对象,如果是,差异有多大?这是在一个单独的绘图线程中运行的,该线程每秒更新30次左右(但仅当图像需要更新时)。请注意,转换将只运行一次。

gdkcr = gtk.gdk.CairoContext(cr)

gdkcr.set_source_pixbuf(img, 0, 0)
gdkcr.paint()

vs

cr.set_source(imgSurface)
cr.rectangle(0, 0, imgSurface.get_width(), imgSurface.get_height())
cr.fill()

共有1个答案

米裕
2023-03-14

正如@UliSchlachter所问,你如何在你的第二个解决方案中获得ImageSurface?我只能猜测它涉及。set_source_pixbuf()。get_source()。get_surface()

pixbuf和cairo在内存中存储像素的方式不同(RGB(A)vs.ARGB),因此set_source_pixbuf()必须逐像素复制图像,同时来回移动位。这相对较快,但仍有成本。如果图像总是相同的,那么在循环之外很容易进行一次转换。

 类似资料:
  • 在教程的这个部分,我们将用Cairo做一些绘图的事情。 Cairo是一种用来创建2D矢量图形的库。我们可以用它来绘制我们的部件,图标或者各种效果或动画。 Simple drawing Stroke 操作是绘制模型的边界,而fill操作是填充模型的内部。下面我们将展示这两个操作。 Code:simpledrawing.py #!/usr/bin/python # ZetCode PyGTK tut

  • 在教程的这个部分,我们将继续用Cairo图形库进行绘图。 Donut 在下面的例子中,我们通过旋转一串椭圆来创建一个复杂的形状。 Code:donut.py #!/usr/bin/python # ZetCode PyGTK tutorial # # This program creates a donut # with cairo library # # author: jan bodnar

  • 在GDK/GTK中检索开罗上下文的机制已损坏和/或在文档中未正确描述。我正在尝试从按钮按回调中绘制Gtk绘制区域,但没有成功。文档建议做 然后用开罗的语境画画,然后在 所有这些似乎都适用于GTK 3.22.30(和cairo 1.15.12),但不适用于GTK3.24.30(和cair 1.16.0)。显然有些事情已经改变了。知道吗?下面是一个完整的例子:

  • LCUI 实现了一些图形 API 用于解决组件的背景、边框和阴影的绘制问题。它们都依赖绘制上下文且都支持局部区域绘制,使得 LCUI 能够利用脏矩形机制和 OpenMP 并行渲染来提升渲染性能。 绘制背景 背景绘制参数被定义为LCUI_Background 结构体类型的对象,由 Background_Paint() 函数负责绘制。在下面的例子中,我们将画布中的区域 (200, 100, 400,

  • 绘制矩形 与其它图形库不同,LCUI 提供的图形 API 只支持矩形这一种形式的图形绘制,不支持基于路径来绘制复杂图形。因此,对于其它复杂的图形,你需要手动编写代码填充像素来绘制。 LCUI 提供了一种绘制矩形的方法: int Graph_FillRect(LCUI_Graph *graph, LCUI_Color color, LCUI_Rect *rec

  • 我想只显示绘图区域内的开罗绘图,但由于某种原因,绘图周围总是有一个彩色矩形形状的背景。我如何摆脱这种情况?我特别不想将其设置为仅透明(因为我可能不支持透明),而只显示绘图本身。 我的例子是在 Rust 中使用 gtk-rs,但其他语言中的任何提示也很棒! 我希望这只显示圆,并查看并保持浏览器在圆周围可单击。我如何才能做到这一点?