Pycairo规模失真

时间:2015-07-10 21:16:40

标签: python scale cairo scaletransform pycairo

我正在努力在一个矩形的png背景上绘制一个圆圈。每当我尝试画一个圆圈时,它会根据我的图像比例拉伸 - 使其成为椭圆形而不是圆形。

以下是设置:

#set background image
surface = cairo.ImageSurface.create_from_png (image)
context = cairo.Context (surface)

WIDTH = cairo.ImageSurface.get_width(surface)
HEIGHT = cairo.ImageSurface.get_height(surface)
context.scale (WIDTH, HEIGHT)

这里是圆绘图功能,(x坐标,y坐标,半径,颜色值)和用于定位的函数:

def draw_node(cx,cy,r, rgb):
  context.arc(x_scale(cx), y_scale(cy), r, 0, 2 * math.pi)
  context.set_source_rgb(rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0)
  context.fill()
  context.stroke()

def x_scale (x):
  width = 1000.0
  return (x + .5) / width

def y_scale (y):
  height = 1000.0 * HEIGHT / WIDTH
  return (y + .5) / height

我特别感谢有关如何解决系统扩展问题的任何建议,但我也很感激如何在现有设置的范围内绘制圆圈的建议。

非常感谢。

1 个答案:

答案 0 :(得分:1)

当缩放不对称时,可能无法避免context.arc将绘制椭圆。使用x_scale (x)功能,您只需将圆心缩放到原来的位置。

作为一种解决方法,我建议将两个方向按相同的数量进行缩放;因此牺牲x_maxy_max将等于1

我的代码会改变:

context.scale(HEIGHT, HEIGHT)
print('surface = 1 x {:1.2f}'.format(WIDTH/HEIGHT))

def draw_node(cx,cy,r, rgb):
  context.arc(cx, cy, r, 0, 2 * math.pi)
  context.set_source_rgb(rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0)
  context.fill()
  context.stroke()

并且不进行任何缩放(如果您愿意,可以按1000缩放)。