libray to frontend image synthesis & 2d canvas renderer
OS
Command
OS X
brew install pkg-config cairo pango libpng jpeg giflib librsvg & npm i -g canvas
接下来会先做功能模块划分和 API 设计,目前已知至少会支持以下特性
绘图元素合成、导出
不同速率的动画队列
滤镜
碰撞检测
WebGL
createImage
通用绘图接口,用于自定义绘图、成就绘图、打卡图等。支持使用 z 进行绘制分层,会按照 z 进行排序。默认先画图片,其次矩形 > 线条 > 文字
字段
类型
描述
可选
width
float64
画布的宽度
height
float64
画布的高度
file_name
string
上传到 oss 的文件名
✅
business_name
string
...
✅
image_type
int
图片类型
✅
wechat_openid
string
用户 id
✅
trace_id
string
...
✅
send
bool
是否发送
✅
字段
类型
描述
可选
name
string
用于标注图片的作用
✅
x
float64
x 坐标,相对于左上角
y
float64
y 坐标
z
int32
z 轴,数值大在上层,与 zindex 保持一致
✅
width
int32
实际绘制宽度
height
int32
实际绘制高度
image_url
string
图片的源地址
resize
bool
是否使用 oss 缩放
✅
expire
int32
缓存过期时间,如果为 0 则不缓存
✅
border_radius
int32
图片圆角,width / 2 即为圆
✅
clip
Clip
见下一张表
✅
字段
类型
描述
可选
x
int32
切图起始坐标,相对图片左上角
y
int32
切图起始坐标,相对图片左上角
width
int32
裁剪尺寸
height
int32
裁剪尺寸
字段
类型
描述
可选
x
float64
x 坐标,相对于左上
y
float64
y 坐标
z
int32
z 轴,数值大在上
size
int32
字号
color
string
颜色,仅支持 rgba 和 hex
content
string
用于绘制的文本
line_height
int32
行高
✅
font_style
int32
文字的粗度
✅
font_family
string
字体
✅
align
int32
默认左对齐, 1-右对齐, 2-居中, 3-两端对齐
✅
limit
float64
文字框最大宽度,用于折行
字段
类型
描述
可选
color
string
线条的颜色,同 text
x1
float64
线条起点
y1
float64
线条起点
x2
float64
线条终点
y2
float64
线条终点
line_width
float64
笔画粗度
dashed
bool
是否是虚线
✅
字段
类型
描述
可选
name
string
用于标注
✅
x
float64
绘制的起点,x
y
float64
绘制的起点,y
width
float64
矩形的宽度
height
float64
矩形高度
background
string
背景色,如果需要透明使用 rgba
✅
radius
[]int32
与图片不同,支持不同的圆角
✅
var a = {
basic: {
width: 1125,
height: 1125,
file_name: "test_mask.png",
business_name: "checkin_version4_3",
image_type: 1,
wechat_openid: "",
trace_id: "",
send: false,
user_id: 83944,
},
draw_info: {
image: [
{
name: "background",
x: 0,
y: 0,
z: 0,
width: 1125,
height: 1125,
image_url:
"https://img.laiye.com/checkinAlbum_20200316083737_htqvLACrln.jpg",
resize: true,
expire: 3600,
clip: {
x: 30,
y: 30,
width: 370,
height: 370,
},
},
],
text: [
{
x: 967.5,
y: 120,
size: 30,
lineHeight: 30,
color: "#ffffff",
content: "2020.03",
fontStyle: 700,
fontFamily: "PingFang",
align: 1, // right
limit: 73,
z: 1,
},
],
line: [
{
color: "#ccc",
x1: 300,
y1: 300,
x2: 500,
y2: 300,
lineWidth: 1.0,
dashed: false,
},
],
rect: [
{
name: "textAreaRect",
x: 30,
y: 550,
width: 690,
height: 170,
background: "#FFF",
opacity: 0.8,
radius: [30, 30, 30, 30],
},
],
},
};
代码目录规划,参考 golang-canvas 和 not-snow-mountain
src
canvas 绘图主业务逻辑
config 配置文件
libs 字体加载,数据库连接,阿里云等
main 项目入口
middleware web 框架相关中间件
protos protobuf,grpc、grpc-gateway使用
routes api 路由(已废弃)
services api 相关数据逻辑
static 静态资源
test demo
views 页面模板
---
main 种子模块
dom dom 相关
cache 数据缓存、事件、快照
event 事件系统、移动事件扩展
component html组件
frame_timer 帧计时器,游戏时间,fps
sprite 绘制精灵
high_socre 计分板
audio 音频支持
control 游戏控制,start,stop,pause
loader 资源加载
var a = {
basic: {
width: 1125,
height: 1125,
file_name: "test_mask.png",
business_name: "checkin_version4_3",
image_type: 1,
wechat_openid: "",
trace_id: "",
send: false,
user_id: 83944,
},
draw_info: {
image: [
{
name: "background",
x: 0,
y: 0,
z: 0,
width: 1125,
height: 1125,
image_url:
"https://img.laiye.com/checkinAlbum_20200316083737_htqvLACrln.jpg",
resize: true,
expire: 3600,
clip: {
x: 30,
y: 30,
width: 370,
height: 370,
},
},
],
text: [
{
x: 967.5,
y: 120,
size: 30,
lineHeight: 30,
color: "#ffffff",
content: "2020.03",
fontStyle: 700,
fontFamily: "PingFang",
align: 1, // right
limit: 73,
z: 1,
},
],
line: [
{
color: "#ccc",
x1: 300,
y1: 300,
x2: 500,
y2: 300,
lineWidth: 1.0,
dashed: false,
},
],
rect: [
{
name: "textAreaRect",
x: 30,
y: 550,
width: 690,
height: 170,
background: "#FFF",
opacity: 0.8,
radius: [30, 30, 30, 30],
},
],
},
};
linter
prettier
precommit
conventional / changelog
livereload / hotreload
module bundler / uglify
jest
npm
Format of the commit message
feat (feature)
fix (bug fix)
docs (documentation)
style (formatting, missing semi colons, …)
refactor
test (when adding missing tests)
chore (maintain)