我正在尝试在win32机器上构建OpenSceneGraph的pdf插件.该插件使用cmake的PKG_CHECK_MODULES宏来查找cairo和poppler库.我不知道如何以这样的方式安装它们,以帮助它找到它们.
我正在做雅典教程,我理解第一步
surface := AthensCairoSurface extent: self extent asIntegerPoint.
Run Code Online (Sandbox Code Playgroud)
然后第2步是
surface drawDuring: [:canvas |
"First, we clear the surface"
surface clear.
"we can use
surface clear: Color black.
as well. A #clear is equivalent to: (surface clear: Color transparent). "
"Let''s draw a simple green rectangle"
canvas setPaint: Color green.
canvas setShape: (40@40 corner: 100@100).
canvas draw.
]
Run Code Online (Sandbox Code Playgroud)
帆布来自哪里?在哪里定义?我只是不明白那一部分.
在我的应用程序中,我使用 Pango 和 Cairo 来创建文本纹理。这些纹理的宽度是固定的,但应缩放其高度以适合文本内容。然后,涉及这种情况的父对象将缩放其高度以匹配文本。
问题是,我初始化 Pango 和 Cairo 的方式不允许这样做。目前,该系统的设置是:
cairo_surface_t* cairoSurface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, sizeX, sizeY );
cairo_t* cairoContext = cairo_create( cairoSurface );
PangoLayout* pangoLayout = pango_cairo_create_layout( cairoContext );
Run Code Online (Sandbox Code Playgroud)
这固定了高度,至少是表面的高度——这是我不想做的事情,至少不是一直如此。
我的理解是,如果不指定布局高度,它会自动缩放高度,然后可以通过 找到pango_layout_get_size()。我想首先创建布局,然后使用此函数的输出来创建表面。
但是,pango_cairo_create_layout()需要已经创建表面,并且我一直无法找到通过开罗渲染布局的方法pango_layout_new()。API 文档中的渲染函数之一pango_cairo_update_layout(),指定pango_cairo_create_layout()必须用于创建布局;然而,更重要的功能,pango_cairo_show_layout(),没有这样的要求,我不确定这是否意味着允许任何 Pango 布局。虽然我可以测试它是否有效,但我担心反复试验可能会导致我出现未定义的行为。
我觉得我陷入了先有鸡还是先有蛋的困境,Pango 的文档主要是 API 参考,几乎没有解释该库的用途。有没有办法正确地做到这一点?
试图让这段代码工作:
import cairosvg
import os
path = "D:/PyProjects/Bla/Temp"
os.chdir(path)
cairosvg.svg2pdf(url='Pic.svg', write_to='image.pdf')
Run Code Online (Sandbox Code Playgroud)
但是遇到类似于这篇文章的错误:
Traceback (most recent call last):
File "D:/work/lean_python/pdf/other.py", line 2, in <module>
import cairosvg
File "D:\env_python352\lib\site-packages\cairosvg\__init__.py", line 29, in <module>
from . import surface
File "D:\env_python352\lib\site-packages\cairosvg\surface.py", line 24, in <module>
import cairocffi as cairo
File "D:\env_python352\lib\site-packages\cairocffi\__init__.py", line 46, in <module>
cairo = dlopen(ffi, 'cairo', 'cairo-2')
File "D:\env_python352\lib\site-packages\cairocffi\__init__.py", line 43, in dlopen
raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
OSError: dlopen() failed to …Run Code Online (Sandbox Code Playgroud) 编辑:此页面提供代码:https : //www.andrewheiss.com/blog/2017/09/27/working-with-r-cairo-graphics-custom-fonts-and-ggplot/
ggsave("test_cario.eps", device=cairo_ps)
ggsave("test_cario.pdf", device=cairo_pdf)
Run Code Online (Sandbox Code Playgroud)
但是,我想知道命令来自哪里。它们未包含在官方文档 ( https://ggplot2.tidyverse.org/reference/ggsave.html )的可能设备列表中。并且,cairo_png 不存在;相反, type="cairo-png" 是必要的,例如:
ggsave("test_cairo.png", type = "cairo-png")
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么争论是一次device = ""又一次type = ""?
我试过这样的代码
ggsave("model.eps", type = "cairo")
Run Code Online (Sandbox Code Playgroud)
或者
ggsave("model.eps", type = "cairo-ps")
或者
ggsave("model.eps", device = "cairo-ps")
但似乎没有任何效果。一般来说,是否可以使用 Cairo 图形设备通过 ggsave 创建 .eps 文件?如果是这样,如何?
我使用带有 pdfcairo 终端的 gnuplot 5.0 绘制 pdf 图,然后使用 Latex 将该图插入到 pdf 文件中。然而,我发现gunplot中的字体大小与latex中的字体大小不同,尽管我将它们设置为相同。
为了使gnuplot和latex中的字体大小一致,我必须将gnuplot中的字体比例设置为0.75,如以下代码所示。
gnuplot 代码:用蓝色绘制“A”(Helvetica,大小 12,字体比例 0.75)。
set terminal pdfcairo font 'Helvetica,12' size 1cm,1cm fontscale 0.75
set output 'test0.pdf'
set xrange [-1:1]
set yrange [-1:1]
unset xtics
unset ytics
unset border
set label 'A' at 0,0 textcolor 'blue'
p 1/0 notitle
Run Code Online (Sandbox Code Playgroud)
Latex 代码:按原始大小插入前一个数字,并在前一个“A”旁边写一个黑色“A”(Helvetica,尺寸 12)。
\documentclass[12pt]{standalone}
\usepackage{tikz}
\usepackage{helvet}
\usepackage{graphicx}
\begin{document}
\begin{tikzpicture}
\node at (0,0) {\includegraphics{test0.pdf}};
\node at (0.3, -0.025) {\textsf{A}};
\end{tikzpicture}
\end{document}
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看最终的 pdf 文件。现在我们可以看到,在 gnuplot 设置“fontscale 0.75”下,这两个“A”的大小完全相同。我不明白为什么在 gnuplot 中应该使用“fontscale …
我正在尝试使用 cairo 绘制一些弧线,但 gcc 警告我gdk_cairo_create() is deprecated. Use gdk_window_begin_draw_frame() and gdk_drawing_context_get_cairo_context() instead。
为了解决这个问题,我做了一些研究,发现对于 gdk_window_begin_draw_frame() 我需要“GdkWindow”。我一直在我的窗口中使用 GtkWidget,所以我需要将“GtkWidget”转换为“GdkWindow”,但 gtk_widget_get_window() 返回NULL 并导致段错误。
#include <gtk/gtk.h>
#include <cairo.h>
void main(int argc , char **argv){
gtk_init(&argc , &argv);
GtkWidget *win;
GdkWindow *gdkwin;
GdkDrawingContext *dc;
cairo_region_t *region;
cairo_t *cr;
win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
region = cairo_region_create();
gdkwin = gtk_widget_get_window(GTK_WIDGET(win));
//Here gdkwin should contain a GdkWindow but it's NULL.
gc = gdk_window_begin_draw_frame(gdkwin , (const cairo_region_t*)®ion);
...
...
Run Code Online (Sandbox Code Playgroud)
这是运行时错误:
(a.out:6852): Gdk-CRITICAL **: 23:53:06.042: gdk_window_begin_draw_frame: assertion 'GDK_IS_WINDOW (window)' failed …Run Code Online (Sandbox Code Playgroud) 尝试在 Django 中运行网站时遇到问题:
OSError: no library called "libcairo-2" was found
cannot load library 'libcairo.so.2': /lib/x86_64-linux-gnu/libfontconfig.so.1: undefined symbol: FT_Done_MM_Var
cannot load library 'libcairo.so': /lib/x86_64-linux-gnu/libfontconfig.so.1: undefined symbol: FT_Done_MM_Var
cannot load library 'libcairo.2.dylib': libcairo.2.dylib: cannot open shared object file: No such file or directory
cannot load library 'libcairo-2.dll': libcairo-2.dll: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
虽然安装了包。
我已经安装了 weasyprint
pip3 install weasyprint
python -m pip install WeasyPrint
sudo apt-get install build-essential python3-dev python3-pip python3-setuptools python3-wheel python3-cffi libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 …Run Code Online (Sandbox Code Playgroud) 我想保存以下情节:
library(ggplot2)
myplot <- ggplot(iris) +
geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
ylab(expression(~delta^13*C~"[\211]"))
ggsave(myplot,
filename = "myplot.png",
type = "cairo")
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Error in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
Metric information not available for this family/device
Run Code Online (Sandbox Code Playgroud)
问题一定是表达式和 unicode 的组合,因为这两者可以工作:
myplot <- ggplot(iris) +
geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
ylab("[\211]")
myplot <- ggplot(iris) +
geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
ylab(expression(~delta^13*C))
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
编辑:我想打印“千分之一”符号。显然它的unicode是U2030,我错误地认为“\211”是一个unicode,但一定是别的东西。
编辑2:与此同时,我发现这个问题也有类似的问题。在那里,一个建议是用 保存情节encoding = "MacRoman",不幸的是这对我不起作用:
Error in png_dev(..., res = …Run Code Online (Sandbox Code Playgroud) 我必须从开罗表面像素数据填充 ffmpeg AVFrame->data。我有这个代码:
/* Image info and pixel data */
width = cairo_image_surface_get_width( surface );
height = cairo_image_surface_get_height( surface );
stride = cairo_image_surface_get_stride( surface );
pix = cairo_image_surface_get_data( surface );
for( row = 0; row < height; row++ )
{
data = pix + row * stride;
for( col = 0; col < width; col++ )
{
img->video_frame->data[0][row * img->video_frame->linesize[0] + col] = data[0];
img->video_frame->data[1][row * img->video_frame->linesize[1] + col] = data[1];
//img->video_frame->data[2][row * img->video_frame->linesize[2] + col] = data[2];
data += …Run Code Online (Sandbox Code Playgroud)