当光栅化svg文件时,我希望能够为生成的png文件设置宽度和高度.使用以下代码,仅将画布设置为所需的宽度和高度,具有原始svg文件尺寸的实际图像内容将呈现在(500,600)画布的左上角.
import cairo
import rsvg
WIDTH, HEIGHT = 500, 600
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)
svg = rsvg.Handle(file="test.svg")
svg.render_cairo(ctx)
surface.write_to_png("test.png")
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能使图像内容与cairo canvas相同?我试过了
svg.set_property('width', 500)
svg.set_property('height', 500)
Run Code Online (Sandbox Code Playgroud)
但得到了
TypeError: property 'width' is not writable
Run Code Online (Sandbox Code Playgroud)
librsvg python绑定的文档似乎非常罕见,只有一些随机代码片段在cairo网站上.
我正在尝试安装pycairo 1.10.0以用于我的自定义构建python 3.1.然而,
sudo /flower/bin/easy_install-3.1 pycairo
Run Code Online (Sandbox Code Playgroud)
失败了
XXX@XXXX:/adventures$ sudo /flower/bin/easy_install-3.1 pycairo
install_dir /flower/lib/python3.1/site-packages/
Searching for pycairo
Reading http://pypi.python.org/simple/pycairo/
Reading http://cairographics.org/pycairo
Best match: pycairo 1.10.0
Downloading http://cairographics.org/releases/pycairo-1.10.0.tar.bz2
Processing pycairo-1.10.0.tar.bz2
error: Couldn't find a setup script in /tmp/easy_install-zeG9HB/pycairo-1.10.0.tar.bz2
Run Code Online (Sandbox Code Playgroud)
事实上,setup.py在上述下载中没有; 相反,INSTALL说:
Install Procedure
-----------------
$ ./waf --help # shows available waf options
$ ./waf configure # use --prefix and --libdir if necessary
# --prefix=/usr --libdir=/usr/lib64 for Fedora 64-bit
$ ./waf build
$ ./waf install
Use
$ python3 ./waf ... …Run Code Online (Sandbox Code Playgroud) #include<stdio.h>
#include<cairo.h>
#include<pango/pangocairo.h>
#define IMAGE_WIDTH 650
#define IMAGE_HEIGHT 150
#define TEXT "HELLO WORLD"
#define FONT "MizuFontAlphabet Normal 40"
/*
* $ gcc $(pkg-config pangocairo cairo --cflags --libs) file.c
*/
int main(int argc , char** argv) {
cairo_surface_t *surface;
cairo_t *cr;
PangoLayout *layout;
PangoFontDescription *desc;
PangoRectangle extents;
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, IMAGE_WIDTH, IMAGE_HEIGHT);
cr = cairo_create(surface);
cairo_rectangle(cr, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_fill(cr);
cairo_stroke(cr);
/* the font is needed to be installed in fonts …Run Code Online (Sandbox Code Playgroud) 我试图在C++应用程序中使用Cairo库,利用它在Mac中的GL加速.(我使用Quartz后端进行了相同的测试,但性能令人失望.)它说它支持EGL和GLX.使用GLX需要(外部安装)XQuartz并打开一个XWindow,所以我倾向于EGL:
Apple的编程指南页面告诉我们使用NSOpenGL*,这个页面和其他人说它使用CGL.
这个(2012)页面说Mac有EAGL,它只与EGL类似(我想它指的是IOS,而不是MAC,因为它的EAGL参考链接到IOS帮助页面).
Angle说它支持EGL但它适用于Windows中的Direct3D,据我所知(?)
据说GLFW v3支持(在未来的版本中?)但是通过GLX,它被称为(?).
Mali表示它有一个适用于Mac的模拟器,但我不知道它是加速还是仅用于其硬件(它还说它只支持不同平台上的EGL子集).
当使用EGL时,大多数链接指的是移动设备.我使用的是Mac OS 10.8和XCode 4.6.目前的情况是什么/我如何(如果可以的话)在Mac(现在)中使用EGL?
我试图通过给绘图一个微妙的阴影效果来增强我的应用程序的图形外观。我正在使用 python 和 cairo 绘图。
使用下面的示例代码,我可以用如图所示的图片绘制一个外圆和一个内圆。

我想要做的是用阴影效果替换那个外圆。
我想我需要使用线性梯度或径向梯度,但我找不到一个很好的例子来实现我想要实现的目标。
有人请指出我正确的方向吗?
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GdkPixbuf
import cairo
import math
class MyWindow (Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='MyWindow')
darea = Gtk.DrawingArea()
darea.connect('draw', self.on_draw)
self.add(darea)
self.width, self.height = self.get_size()
filename = "/usr/share/backgrounds/Thingvellir_by_pattersa.jpg"
if self.width > self.height:
self.width = self.height
else:
self.height = self.width
self.width = self.width
self.height = self.height
self.pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
self.pixbuf = self.pixbuf.scale_simple(self.width, self.width, GdkPixbuf.InterpType.BILINEAR)
def on_draw(self, widget, cr):
w = self.width
h = self.height …Run Code Online (Sandbox Code Playgroud) 我最近从项目网站下载并安装了C的Cairo图形库.
我尝试使用网站常见问题解答中的给定代码来运行开罗的hello world程序.在Terminal中,我应用了同一页面给出的相同命令来编译它.但是当我尝试编译它时,出现了未定义引用的错误.

在终端中,输出是:
cc -o hello $(pkg-config --cflags --libs cairo) hello.c
/tmp/cco08jEN.o: In function `main':
hello.c:(.text+0x1f): undefined reference to `cairo_image_surface_create'
hello.c:(.text+0x2f): undefined reference to `cairo_create'
hello.c:(.text+0x4e): undefined reference to `cairo_select_font_face'
hello.c:(.text+0x6d): undefined reference to `cairo_set_font_size'
hello.c:(.text+0x89): undefined reference to `cairo_set_source_rgb'
hello.c:(.text+0xbb): undefined reference to `cairo_move_to'
hello.c:(.text+0xcc): undefined reference to `cairo_show_text'
hello.c:(.text+0xd8): undefined reference to `cairo_destroy'
hello.c:(.text+0xe9): undefined reference to `cairo_surface_write_to_png'
hello.c:(.text+0xf5): undefined reference to `cairo_surface_destroy'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我的源代码是:
#include <cairo.h> …Run Code Online (Sandbox Code Playgroud) 我需要在X11中直接在屏幕上绘制一个形状(一个小箭头),它用作叠加层.我正在寻找大约一个小时没有没有好结果.任何人都可以为我提供一个很好的切入点吗?我可以使用的技术是cairo,gtk或XLib.
到目前为止我发现的所有东西都取决于构图,它并不总是可用,或者会在我的箭头(矩形,窗口)后面创建一个白色的形状.
编辑:我现在能够使用Composite和Cairo绘制X11叠加层.我是这样做的(注意:这是一个最小的例子.几乎没有错误检查!!!).从终端开始可以退出它!
// COMPILE WITH: g++ -o overlay overlay.cc -lXfixes -lXcomposite -lX11 `pkg-config --cflags --libs cairo`
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/shape.h>
#include <cairo/cairo.h>
#include <cairo/cairo-xlib.h>
#include <stdio.h>
#include <unistd.h>
Display *display_;
int old_x_, old_y_;
cairo_surface_t *surf_;
Window overlay_;
int screen_;
int height_;
int width_;
cairo_t *cr_;
void paint_cursor(int new_x, int new_y, bool first = false)
{
if (!first)
{
cairo_set_operator(cr_, CAIRO_OPERATOR_CLEAR);
cairo_rectangle(cr_, old_x_, old_y_, 20, 20);
cairo_fill(cr_);
}
old_x_ = new_x;
old_y_ = new_y; …Run Code Online (Sandbox Code Playgroud) 我刚刚安装了 cairosvg,它似乎奏效了。如果我尝试再次安装,它会说:
$ pip install cairosvg
需求已经满足(...)
但是如果我尝试在 python3 中导入它,它会提供一个导入错误:
>>>导入 cairosvg
回溯(最近一次调用最后一次):
(...)
ImportError:没有名为“cairosvg”的模块
任何想法这里出了什么问题?顺便说一句,我正在尝试将 .svg 文件转换为 .png 文件,如果有更简单的可能性,请随时告诉我!
当我尝试安装时,cairosvg它说要求满足。
Requirement already satisfied: cairosvg in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
Requirement already satisfied: cairocffi in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cairosvg)
Requirement already satisfied: lxml in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cairosvg)
Requirement already satisfied: cssselect in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cairosvg)
Requirement already satisfied: pillow in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cairosvg)
Requirement already satisfied: tinycss in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cairosvg)
Requirement already satisfied: cffi>=0.6 in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cairocffi->cairosvg)
Requirement already satisfied: olefile in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from pillow->cairosvg)
Requirement already satisfied: pycparser in
c:\users\kshitij\appdata\local\programs\python\python35\lib\site-packages
(from cffi>=0.6->cairocffi->cairosvg)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在 IDLE 中导入它时,它给出了以下错误:
import cairosvg
File "C:\Users\Kshitij\AppData\Local\Programs\Python\Python35\lib\site- …Run Code Online (Sandbox Code Playgroud) 问题:哪个可重现的过程可以使 Windows Python 用户将 SVG 图像渲染为 PNG?
许多问题/答案(例如Convert SVG to PNG in Python和Server-side SVG to PNG (or some other image format) in python,由于下面解释的原因,它们不重复)解释了如何使用 Python 将 SVG 转换为 PNG .
不幸的是,它们都不能用于 Python + Windows。经过 20 多分钟,以及许多不同的尝试,我仍然无法做到。有关失败尝试的更多详细信息:
cairo在 Windows 上安装并不简单,我们必须使用 Gohlke 的二进制文件在 Windows 上使用 Python 3.7 安装 pycairo:
pip install pycairo-1.20.0-cp37-cp37m-win_amd64.whl
Run Code Online (Sandbox Code Playgroud)
甚至有一次cairo安装,rsvg(从主答案为PNG(或其他图像格式)的Python服务器端SVG,转换SVG至PNG在Python)不适用于Windows:
pip install rsvg # or pyrsvg
> ERROR: No matching distribution found for …Run Code Online (Sandbox Code Playgroud)