Canvas 模块
Canvas 模块提供了一组简洁的 API,用于在 DQL 脚本中实现绘图功能。
下面是一个简单的例子,绘制一个圆形图案。
dc = canvas.Context(1000, 1000) # 创建画布对象,指定大小为1000x1000
dc.draw_circle(500, 500, 400) # 在画布上绘制一个圆形,圆心为(500, 500),半径为400
dc.set_hex_color("#FF0000") # 设置颜色为红色
dc.fill() # 填充圆形
return dc.get_data_uri() # 返回图像的 Data URI
图片效果为:
![](/datadata-docs/assets/ideal-img/00.dcd6c91.1000.png)
提示
Canvas API 基于 https://github.com/fogleman/gg 实现,更多详细信息请参考 https://github.com/fogleman/gg。
API
# 创建一个 Context 对象,需要指定画布的大小
canvas.NewContext(width: int, height: int)
# 角度转为弧度
canvas.radians(degrees float64) float64
# 弧度转为角度
canvas.degrees(radians float64) float64
Context
context
类似 HTML Canvas API 的 Context2D
,用于提供绘制相关的函数。
画图
draw_point(x, y, r float64) # 绘制一个点
draw_line(x1, y1, x2, y2 float64) # 绘制一条线段
draw_rectangle(x, y, w, h float64) # 绘制矩形
draw_rounded_rectangle(x, y, w, h, r float64) # 绘制圆角矩形
draw_circle(x, y, r float64) # 绘制圆形
draw_arc(x, y, r, angle1, angle2 float64) # 绘制圆弧
draw_ellipse(x, y, rx, ry float64) # 绘制椭圆
draw_elliptical_arc(x, y, rx, ry, angle1, angle2 float64) # 绘制椭圆弧
draw_regular_polygon(n int, x, y, r, rotation float64) # 绘制正多边形
set_pixel(x, y int) # 设置像素点
move_to(x, y float64) # 移动到指定坐标
line_to(x, y float64) # 绘制一条线到指定坐标
quadratic_to(x1, y1, x2, y2 float64) # 绘制二次贝塞尔曲线
cubic_to(x1, y1, x2, y2, x3, y3 float64) # 绘制三次贝塞尔曲线
close_path() # 关闭路径
clear_path() # 清除路径
new_sub_path() # 新建子路径
clear() # 清除画布
stroke() # 描边
fill() # 填充
stroke_preserve() # 描边并保持路径
fill_preserve() # 填充并保持路径
通常希望将图像居中于一点。
使用 draw_image_anchored
并将 ax
和 ay
设置为 0.5
来执行此操作。
使用 0
左对齐或上对齐。
使用 1
右对齐或下对齐。
draw_string_anchored
对文本执行相同的操作,因此您无需自己调用 measure_string
。
文本
draw_string(s string, x, y float64) # 绘制文本
draw_string_anchored(s string, x, y, ax, ay float64) # 绘制锚定位置的文本
draw_string_wrapped(s string, x, y, ax, ay, width, lineSpacing float64, align Align) # 换行文本
measure_string(s string) (w, h float64) # 测量字符串的宽度和高度
measure_multiline_string(s string, lineSpacing float64) (w, h float64) # 测量多行字符串的宽度和高度
word_wrap(s string, w float64) []string # 将文本按宽度换行
颜色
set_rgb(r, g, b float64) # 设置RGB颜色
set_rgba(r, g, b, a float64) # 设置RGBA颜色
set_rgb255(r, g, b int) # 设置RGB颜色(255范围)
set_rgba255(r, g, b, a int) # 设置RGBA颜色(255范围)
set_hex_color(x string) # 设置十六进制颜色
描边和填充
set_line_width(lineWidth float64) # 设置线条宽度
set_line_cap(lineCap LineCap) # 设置线条端点样式
set_line_join(lineJoin LineJoin) # 设置线条连接样式
set_dash(dashes ...float64) # 设置虚线样式
set_dash_offset(offset float64) # 设置虚线的偏移
set_fill_rule(fillRule FillRule) # 设置填充规则
渐变和图案
new_linear_gradient(x0, y0, x1, y1 float64) # 创建线性渐变
new_radial_gradient(x0, y0, r0, x1, y1, r1 float64) # 创建径向渐变
new_conic_gradient(cx, cy, deg float64) # 创建圆锥渐变
变形
identity() # 恢复默认变换
translate(x, y float64) # 平移变换
scale(x, y float64) # 缩放变换
rotate(angle float64) # 旋转变换
shear(x, y float64) # 剪切变换
scale_about(sx, sy, x, y float64) # 绕点缩放
rotate_about(angle, x, y float64) # 绕点旋转
shear_about(sx, sy, x, y float64) # 绕点剪切
transform_point(x, y float64) (tx, ty float64) # 变换点坐标
invert_y() # 反转Y轴方向
经常需要围绕一个非原点的点进行旋转或缩放。为了方便起见,我们提供了旋转(RotateAbout
)、缩放(ScaleAbout
)和剪切(ShearAbout
)函数。
InvertY
是为了防止 Y 应从下到上增加而不是默认的从上到下增加。
状态保存恢复
保存和恢复上下文的状态。这些可以嵌套。
push() # 保存当前状态
pop() # 恢复上一个状态
裁剪
使用裁剪区域可将绘图操作限制在使用路径定义的区域内。
clip() # 启用裁剪
clip_preserve() # 启用裁剪并保持当前路径
reset_clip() # 重置裁剪区域
invert_mask() # 反转掩码
例子
这是另外一个例子,绘制旋转的椭圆:
S = 1024 # 设置画布大小
dc = canvas.Context(S, S) # 创建画布对象
dc.set_rgba(10, 250, 10, 0.1) # 设置颜色
for i in range(0, 360, 15): # 循环绘制多个旋转的椭圆
dc.push() # 保存当前状态
dc.rotate_about(canvas.radians(i), S/2, S/2) # 绕画布中心旋转
dc.draw_ellipse(S/2, S/2, S*7/16, S/8) # 绘制椭圆
dc.fill() # 填充颜色
dc.pop() # 恢复到之前的状态
return dc.get_data_uri() # 返回图像的 Data URI
呈现方式
使用 DQL 语言进行 Canvas 画图,需要通过表格方式在具体表格内呈现具体图像。