1

似乎给出了其中的信息stroke_extents()和函数translate(x, y)scale(x, y)我应该能够采用任意的 cairo(我正在使用 pycairo)路径并“最适合”它。换句话说,将其居中并展开以填充可用空间。

在绘制路径之前,我已经对画布进行了缩放,使得原点为左下角,向上为 y+,右侧为 x+,高度和宽度均为 1。鉴于这些条件,这段代码似乎正确地缩放了路径:

# cr is the canvas
extents = cr.stroke_extents()
x_size = abs(extents[0]) + abs(extents[2])
y_size = abs(extents[1]) + abs(extents[3])
cr.scale(1.0 / x_size, 1.0 / y_size)

我无法为我的生活弄清楚翻译。有没有更简单的方法?我怎样才能在画布上“最适合”开罗路径?

如果这个问题有任何不清楚的地方,请要求澄清。

4

2 回答 2

2

我找到了一个我喜欢的解决方案(至少就我的目的而言)。只需创建一个新表面并将旧表面涂在新表面上即可。

于 2010-05-28T03:14:59.850 回答
0

仅就比例而言,我做了类似的事情,以“最适合”的方法调整盒子内的图像。至于规模,这里是代码:

available_width = 800
available_height = 600
path_width = 500    
figure_height = 700     

# formulas
width_ratio = float(available_width)/path_width
height_ratio = float(available_height)/figure_height
scale = min(height_ratio, width_ratio)

# result
new_path_width = path_width*scale
new_figure_height = figure_height*scale

print new_path_width, new_figure_height

图像被绘制成与原点对齐(在我的例子中是左上角),所以也许应该做类似的事情来翻译路径。

此外,这种最佳拟合旨在保持纵横比。如果要拉伸图形,请使用每个比率而不是“比例”变量。

希望我有帮助

于 2011-04-01T13:52:57.730 回答