根据cairo示例代码,以下代码
double x=25.6, y=128.0;
double x1=102.4, y1=230.4,
x2=153.6, y2=25.6,
x3=230.4, y3=128.0;
cairo_move_to (cr, x, y);
cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);
cairo_set_line_width (cr, 10.0);
cairo_stroke (cr);
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_set_line_width (cr, 6.0);
cairo_move_to (cr,x,y); cairo_line_to (cr,x1,y1);
cairo_move_to (cr,x2,y2); cairo_line_to (cr,x3,y3);
cairo_stroke (cr);
Run Code Online (Sandbox Code Playgroud)
可以生成曲线和两条粉红色的线条.

但那需要4个点,(x,y),(x1,y1),(x2,y2),(x3,y3)
如果我只有x,y和x3,y3(曲线的起点和终点),是否有任何数学公式可以生成那些粉红色的线而不知道x1,y1和x2,y2?
编辑:
它适用于我通过以下方式生成曲线的情况.
cairo_move_to (cr, x, y);
cairo_curve_to (cr, x, y3, x3, y, x3, y3);
Run Code Online (Sandbox Code Playgroud) 我在让Pango Cairo自言自语方面遇到了问题.下面是一些演示代码.我将布局的宽度设置为与红色矩形相同,所以我希望它包裹到红色矩形.实际上,它只是在每一行上放置一个单词,就好像宽度设置得非常小.如果我使用pango.WRAP_WORD_CHAR,我只能获得一行字符.
我究竟做错了什么?如何将布局包装到我指定的宽度?
编辑如果我将宽度设置为100000,则单词正确包装.这意味着set_width和构造参数使用不同的单位.有任何想法吗?
# -*- coding: utf-8 -*-
import sys
import cairo
import pango
import pangocairo
SIZE = 200
HALF = 100
QUARTER = 50
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, SIZE, SIZE)
context = cairo.Context(surface)
context.set_source_rgb(1, 0, 0)
context.rectangle(QUARTER, QUARTER, HALF, HALF)
context.fill()
context.set_source_rgb(1, 1, 0)
context.translate(QUARTER, QUARTER)
pangocairo_context = pangocairo.CairoContext(context)
layout = pangocairo_context.create_layout()
layout.set_width(HALF)
layout.set_alignment(pango.ALIGN_LEFT)
layout.set_wrap(pango.WRAP_WORD)
layout.set_font_description(pango.FontDescription("Arial 10"))
layout.set_text("The Quick Brown Fox Jumps Over The Piqued Gymnast")
pangocairo_context.update_layout(layout)
pangocairo_context.show_layout(layout)
context.show_page()
with file("test.png", "w") as op:
surface.write_to_png(op)
Run Code Online (Sandbox Code Playgroud)

首先是一些背景.
我试图用开罗(实际上是pycairo)绘制一个Gdk(实际上是pygtk)pixbuf.我原来的代码看起来像这样:
import cairo as C
import gtk.gdk as GG
FMT = C.FORMAT_ARGB32
CSP = GG.COLORSPACE_RGB
st = C.ImageSurface.format_stride_for_width(FMT, zw)
surf = C.ImageSurface(FMT, zw, zh)
c = C.Context(surf)
# draw into c here ...
pixels = surf.get_data()
return GG.pixbuf_new_from_data(pixels, CSP, True, 8, zw, zh, st)
Run Code Online (Sandbox Code Playgroud)
有一段时间,看起来这只会起作用,直到我试图绘制颜色而不仅仅是黑色文本.事实证明两个库在字节顺序上不一致,如下所示:
# !!! FIXME !!! cairo ARGB surfaces and gdk pixbufs disagree on bytesex:
# cairo: LSB --> B G R A <-- MSB
# gdk: LSB --> R G B A <-- MSB
# …Run Code Online (Sandbox Code Playgroud) 我看到这里有一个类似的问题.
所以我已经做了一些研究,请不要像那样关闭我的问题.
如何在Windows上安装PyCairo(Cairo for Python)?
从2012年开始,我猜它已经过时了.
我正在尝试在安装了Python 3.6.3的Windows 7 64位笔记本电脑上安装pycairo.如果重要的话,我还安装了最新的setuptools.
我正面临下面的错误.
C:\Programs\Python36>python
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z
C:\Programs\Python36>pip install pycairo
Collecting pycairo
Using cached pycairo-1.15.4.tar.gz
Installing collected packages: pycairo
Running setup.py install for pycairo ... error
Complete output from command c:\programs\python36\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\petr
op01\\AppData\\Local\\Temp\\pip-build-vbfoifen\\pycairo\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().
replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\petrop01\AppData\Local\Temp\
pip-rrp9zlme-record\install-record.txt --single-version-externally-managed --compile:
running …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
进口开罗
导入操作系统
从 PIL 导入图像
图像大小 = (512,128)
表面 = cairo.ImageSurface(cairo.FORMAT_ARGB32, *imagesize)
cr = cairo.Context(表面)
cr.select_font_face("Verdana", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
cr.set_font_size(24)
cr.set_source_rgb(1, 1, 1)
...
surface.write_to_png("MyImage.png")
如您所见,我正在为此 PNG 绘制一些白色文本,但背景默认为不透明的黑色。如何使 png 透明,以便只显示白色文本?
如果我尝试从 cairo 网站运行此示例,则会得到:
AttributeError: 'module' object has no attribute 'cairo_font_map_get_default'
Run Code Online (Sandbox Code Playgroud)
我想我错过了一些包裹?(我在 Ubuntu 14.04 上)
但是,我试图找到我需要的开发包,我找到的唯一答案是this,它从 GTK2 堆栈中推荐了一些东西,但如果有的话,我对 GTK3 感兴趣,而不是 2。
我在d3.js中生成了一些图表.我使用下面的代码来计算放在y轴上的值,它就像一个魅力.
var s = d3.scale.linear().domain([minValue, maxValue]);
var ticks = s.nice().ticks(numberOfPoints);
Run Code Online (Sandbox Code Playgroud)
但是我现在必须使用pycairo编写python代码,pycairo在服务器端生成d3.js图表的克隆.
我的问题是,是否有人知道上面代码中使用的逻辑,或者可以给出类似结果的东西,以便我可以在python中复制它以获得在y轴中使用的漂亮值?
我正在使用 python iGraph 进行网络可视化。当我尝试绘制图形时,我收到了他的错误消息:
>>> layout = g.layout("kk")
>>> plot(g, layout = layout)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.macosx-10.5-x86_64/egg/igraph/drawing/__init__.py", line 446, in plot
File "build/bdist.macosx-10.5-x86_64/egg/igraph/drawing/__init__.py", line 117, in __init__
File "build/bdist.macosx-10.5-x86_64/egg/igraph/drawing/utils.py", line 396, in __getattr__
TypeError: plotting not available
Run Code Online (Sandbox Code Playgroud)
我认为我没有正确安装 Cairo 或 PyCairo。
我不熟悉使用 Fink 或 MacPorts,因为我通常使用 Homebrew。
非常感谢您的任何帮助。
在GtkDrawingArea 的参考手册中,它说
\n\n\n\n\n当绘图区域第一次出现在屏幕上时,或者当它被另一个窗口覆盖然后又被覆盖时,通常会传递绘图信号。您还可以通过添加到绘图区域\xe2\x80\x99s窗口的\xe2\x80\x9cdamage区域\xe2\x80\x9d来强制暴露事件;
\ngtk_widget_queue_draw_area()并且gdk_window_invalidate_rect()都是同样好的方法来做到这一点。然后,您\xe2\x80\x99将获得无效区域的绘制信号。
那么我怎样才能在绘制信号的处理程序中获取无效区域呢?\n它是剪辑区域吗?
\n我正在尝试使用 GTK3 库和 pycairo 在 python3 中制作一些简单的动画。
我一直试图找到简单的单文件示例但无济于事,但我确信它是可行的。
我找到的最接近的是:https://cairographics.org/cookbook/animationrotation/,但这是在 python2 中,库/依赖项完全不同。
有没有人能指点我一个体面的来源,或对上述代码的修改?
谢谢!
pycairo ×10
cairo ×6
python ×4
gtk ×2
pango ×2
pangocairo ×2
pygtk ×2
charts ×1
d3.js ×1
gtk3 ×1
igraph ×1
image ×1
javascript ×1
numpy ×1
pygobject ×1
python-3.x ×1
transparency ×1