# sakura-canvas(海报生成器) # 用前需知: ## 1、小程序绘制时,记得配置图片的域名为安全域名(白名单) ## 2、兼容性。目前只测试过APP(不包括NVUE页面), 微信小程序, H5, 字节跳动小程序。其他小程序未测。 # 引入 ```javascript import Draw from '@/uni_modules/sakura-canvas/js_sdk/draw' ``` # 使用教程 ## 初始化 ```javascript let draw = new Draw({ width: 375, // canvas(海报)的宽度 必填 height: 500, // canvas(海报)的高度 必填 canvasId: 'myCanvas', // canvasId 必填 _this: this, // 传入this实例 必填 background: { type: 'color', // 背景样式 color: 纯色 image: 图片 color: '#fffff', // color: 参数详看绘制矩形的参数 // image: 详看绘制图片时的参数 }, // 背景 默认纯白, drawDelayTime: 200, // 绘制海报时的延迟时间(单位毫秒),默认200, delayTime: 200, // 导出图片时的延迟时间(单位毫秒),默认200, fileType: 'png', // 导出图片的类型, 默认png 可选jpg, png quality: 1, // 导出图片的质量, 默认1 值范围0~1, 大于一都为1处理 drawTipsText: '绘制中...', // 绘制时的加载提示, 默认绘制中... }) ``` ## Draw类内置方法大纲 # 非Json方式绘制 ## 绘制文本-text # !!!注意绘制文本添加使用\n实现自定义换行 ```javascript // 绘制文字 draw.drawText({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 w: 100, // 文字宽度 默认整个画布的宽度 - x轴的距离 text: '你好\n世界', // 文字内容 textIndent: 0, // 文字首行缩进 默认0 注意在设置了windowAlign或者textAlign的时候会失去作用 font: { size: 12, // 文字大小 默认12 family: '微软雅黑', // 文字字体 默认sans-serif style: 'normal', // 文字样式 默认 normal 可选: italic: 斜体 oblique: 倾斜体 weight: 'normal' // 文字粗体 默认 normal 可传递 bold: 粗体 数字 }, line: { num: -1, // 限制文字行数,默认 -1: 不限制 限制行数,多出部分会变成... height: 16, // 行高默认16 style: 'none', // 样式 默认none: 不需要 可选 underline: 下划线, lineThrough 删除线 type: 'solid', // 线类型 当使用样式时线的类型 默认: solid 实线 可选: dashed 虚线 width: 1, // 线宽度 默认1 }, color: '#000000', // 文字颜色 默认#000000 在不考虑字节跳动小程序的前提下可简写(#000) alpha: 1, // 透明度 默认1 取值范围 0~1 isFill: true, // 是否是填充字体, false: 线性字体 windowAlign: 'none', // 文字在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right textAlign: 'none', // 文字水平对齐的方式 默认: none 可选 居中: center 右边: right }) ``` ## 绘制矩形-rect ```javascript // 绘制矩形 draw.drawRect({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 w: 100, // 宽度 必填 h: 100, // 高度 必填 r: 0, // 矩形圆角大小 默认: 0 color: '#000000', // 颜色 默认#000000 在不考虑字节跳动小程序的前提下可简写(#000) alpha: 1, // 透明度 默认1 取值范围 0~1 isFill: true, // 是否是填充矩形, false: 线性矩形 lineWidth: 1, // 当矩形为线性时,矩形的边框宽度 windowAlign: 'none', // 矩形在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right // 旋转 rotate: { deg: 0, // 旋转角度 type: 'middle', // 旋转的中心点 默认: middle: 矩形正中心 // topLeft: 中心点在上左 topMiddle 中心点在上中 topRight 中心点在上右 // middleLeft: 中心点在中左 bottomMiddle 中心点在正中间 middleRight 中心点在中右 // bottomLeft: 中心点在下左 bottomMiddle 中心点在下中 middleRight 中心点在下右 }, borderWidth: 0, // 边框大小 默认0 (类型为填充矩形时生效) borderColor: '#ffffff', // 边框颜色 默认无颜色 (类型为填充矩形时生效) // 圆角的方向 // 值类型为数组, 添加不同的圆角方向设置哪里是圆角哪里不是圆角 // 参数可选值 tr: 上右; tl: 上左; bl:左下; br: 左右; default: 全圆角 borderType: ['tr', 'tl'] // 默认全圆角['default'] }) ``` ## 绘制圆-arc ```javascript // 绘制圆 draw.drawArc({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 r: 100, // 圆半径 必填 s: 0, // 画圆的起始角度 e: Math.PI * 2, // 画圆的终止角度 d: false, // 指定弧度的方向是逆时针还是顺时针。默认是false,即顺时针。 color: '#000000', // 颜色 默认#000000 在不考虑字节跳动小程序的前提下可简写(#000) alpha: 1, // 透明度 默认1 取值范围 0~1 isFill: true, // 是否是填充圆, false: 线性圆 lineWidth: 1, // 当圆为线性时,圆的边框宽度 windowAlign: 'none', // 圆在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right borderWidth: 0, // 边框大小 默认0 (类型为填充圆时生效) borderColor: '#ffffff' // 边框颜色 默认无颜色 (类型为填充圆时生效) }) ``` ## 绘制三角形-triangle ```javascript // 绘制三角形 draw.drawTriangle({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 w: 100, // 宽度 必填 h: 100, // 高度 必填 r: 0, // 矩形圆角大小 默认: 0 color: '#000000', // 颜色 默认#000000 在不考虑字节跳动小程序的前提下可简写(#000) alpha: 1, // 透明度 默认1 取值范围 0~1 isFill: true, // 是否是填充三角形, false: 线性三角形 lineWidth: 1, // 当三角形为线性时,三角形的边框宽度 drawType: 'isosceles', // 绘制的三角形类型 默认 isosceles: 等腰三角形 right: 直角三角形 custom: 自定义自定义时,x, y, 宽, 高都不需要传递。需要传递绘制点的坐标类型是数组(coordinate) // 三角形定点朝向 top, left, right, bottom (只在等腰三角形和直角三角形里生效,自定义绘制不生效) direction: params.direction || 'top', coordinate: [], // 当绘制类别是自定义的时候需要传递的参数[[x1, y1], [x2, y2], [x3, y3]] windowAlign: 'none', // 三角形在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right (并且三角形类型不能为自定义) // 旋转 rotate: { deg: 0, // 旋转角度 type: 'middle', // 旋转的中心点 默认: middle: 三角形正中心 // top: 上 left: 左 right: 右 middle: 中心 }, borderWidth: 0, // 边框大小 默认0 (类型为填充三角形时生效) borderColor: '#ffffff' // 边框颜色 默认无颜色 (类型为填充三角形时生效) }) ``` ## 绘制线条-line ```javascript // 绘制线条 draw.drawLine({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 w: 100, // 宽度 默认整个画布的宽度 - x轴的距离 color: '#000000', // 颜色 默认#000000 在不考虑字节跳动小程序的前提下可简写(#000) alpha: 1, // 透明度 默认1 取值范围 0~1 lineType: 'solid', // 线条类型 默认 solid: 实线 可选 dashed: 虚线 pattern: [5, 5], // 当线条类型为虚线是生效,具体详看CanvasContext.setLineDash文档 offset: 5, // 虚线偏移量 默认: 5 lineWidth: 1, // 线条高度 lineCap: 'butt', // 线条端点样式 默认 butt 可选 round, square windowAlign: 'none', // 线条在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right }) ``` ## 绘制图片-image ```javascript // 绘制图片 await draw.drawImage({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 w: 100, // 图片宽度 必填 h: 100, // 图片高度 必填 r: 0, // 当图片样式为矩形时, 圆角的大小 alpha: 1, // 透明度 默认1 取值范围 0~1 src: '/static/logo.png', // 图片资源路径 必填 网络路径(小程序中需要配置白名单),本地路径, base64(使用base64格式绘制速度会稍微慢点,在IOS端显著。) mode: 'aspectFill', // 图片模式 默认 aspectFill 可选 aspectFit, widthFix, heightFix drawType: 'default', // 图片样式 default: 默认 rect: 矩形, arc: 圆形 triangle: 三角形 triangle: { type: 'isosceles', // 三角形的类型 right: 直角三角形 isosceles: 等腰三角形 custom: 自定义三角形(不支持旋转) coordinate: [], // 自定义时传递, [[x1, y1], [x2, y2], [x3, y3]], triangle: 'top', // 三角形顶点朝向 }, // 绘制三角形时传递 borderWidth: 0, // 图片边框大小 borderColor: '#ffffff', // 图片边框颜色 // 图片圆角的方向 // 值类型为数组, 添加不同的圆角方向设置哪里是圆角哪里不是圆角 // 参数可选值 tr: 上右; tl: 上左; bl:左下; br: 左右; default: 全圆角 borderType: ['tr', 'tl'], // 默认全圆角['default'] windowAlign: 'none', // 图片在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right quality: 80, // 压缩图片的质量 默认 80 值范围0~100 rotate: {}, // 旋转 具体可看绘制矩形和绘制三角形中的属性值 }) ``` ## 绘制二维码 ```javascript // 绘制二维码 draw.drawQrCode({ x: 0, // x轴方向 默认 0 y: 0, // y轴方向 默认 0 size: 100, // 二维码的大小 默认100 text: '', // 二维码内容 默认'' background: '#000000', // 二维码背景色 默认#00000 foreground: '#ffffff', // 二维码前景色 默认#fffff pdground: '#ffffff', // 二维码角标色 默认 #fffff lv: 3, // 容错级别(一般不需要调它) 默认值是3 windowAlign: 'none', // 二维码在窗口(整个画布的宽度)对齐的方式 默认: none 可选 居中: center 右边: right // 二维码中间的图片 可选 image: { src: '/static/logo.png', //网络路径(小程序中需要配置白名单),本地路径, base64(使用base64格式绘制速度会稍微慢点,在IOS端显著。) size: 30, // 图片大小 默认 30 r: 0, // 图片圆角 默认 0 borderWidth: 0, // 图片边框大小 默认0 borderColor: '#ffffff' // 图片边框颜色 默认无颜色 } }) ``` ## 自定义绘制-custom ### 具体详看Context文档 [点我跳转](https://uniapp.dcloud.io/api/canvas/CanvasContext) ```javascript // 自定义绘制 draw.Context.fillText('你好', 0, 200) ``` ## 将通过以上方法绘制的内容绘制到画板上 ```javascript // complete 是否导出图片,默认 true会绘制图片并返回图片路径 false时需要自行调用uni.canvasToTempFilePath()方法导出图片 await draw.canvasDraw(complete) ``` # Json方式绘制内容(推荐使用Json方式绘制) ```javascript // bgObj: 背景大小含有背景宽高 // ctxObj: 画布大小含有画布宽高 // res接收参数格式 // res.success: 是否成功 true: 成功 false: 失败 // res.message: 成功或者失败时的信息 // res.data: 成功时绘制的图片路径 let res = await draw.createdSharePoster(({ bgObj, ctxObj }) => { let data = [ // 绘制文字 { name: '', // 用于在callBack中寻找 type: 'text', // callBack: 用于知道上一次绘制的内容具体的数据 // before: 上一次绘制的内容的数据,当你绘制的内容处于第一个则是一个空对象 // all: 所有绘制内容的数据 callBack: (before, all) => { let { sx, sy, ex, ey, w, h } = before // sx: 上一次绘制内容开始的x轴位置 // sy: 上一次绘制内容开始的y轴位置 // ex: 上一次绘制内容结束的x轴位置 // ey: 上一次绘制内容结束的y轴位置 // w: 上一次绘制内容的宽度 // h: 上一次绘制内容的高度 // callBack 返回的对象会覆盖原属性 return { x: sx, y: sy } } zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawText 方法的参数 }, // 绘制矩形 { type: 'rect', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawRect 方法的参数 }, // 绘制圆 { type: 'arc', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawArc 方法的参数 }, // 绘制三角形 { type: 'triangle', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawTriangle 方法的参数 }, // 绘制线条 { type: 'line', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawLine 方法的参数 }, // 绘制图片 { type: 'image', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawImage 方法的参数 }, // 绘制二维码 { type: 'qrcode', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawQrCode 方法的参数 }, // 自定义绘制 { type: 'custom', zIndex: 0, // 绘制顺序 越小越先绘制 // Context: 调用原生方法绘制 // _this: 调用draw类的内置方法绘制 setDarw(Context, _this) { // 原生方法绘制 Context.fillText('你好', 0, 200) // 使用draw类内置方法绘制 _this.drawText({ x: 0, y: 0, text: '你好, 世界' }) } } ] return data }) ``` # 绘制时,需要提前绘制一部分内容,然后后面等数据有了在绘制一部分内容的需求 ```javascript // 初始化 let draw = new Draw({ width: 375, // canvas(海报)的宽度, height: 500, // canvas(海报)的高度, canvasId: 'myCanvas', // canvasId 必填 _this: this, // 传入this实例 必填 drawDelayTime: 200, // 绘制海报时的延迟时间(单位毫秒),默认200, delayTime: 200, // 导出图片时的延迟时间(单位毫秒),默认200, fileType: 'png', // 导出图片的类型, 默认png 可选jpg, png quality: 1, // 导出图片的质量, 默认1 值范围0~1, 大于一都为1处理 drawTipsText: '绘制中...', // 绘制时的加载提示, 默认绘制中... }) // 预绘制需要自行调用绘制背景 await draw.preDrawBackground() // draw.preDraw(drawArray), complete) // 参数 // drawArray: 参数如下 // complete: 是否绘制完成,绘制完成会自行导出图片 默认false // 返回值 // res接收参数格式 // res.success: 是否成功 true: 成功 false: 失败 // res.message: 成功或者失败时的信息 // res.data: 成功时绘制的图片路径 let res = await draw.preDraw(({ bgObj, ctxObj }) => { let data = [ // 绘制文字 { type: 'text', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawText 方法的参数 }, // 绘制矩形 { type: 'rect', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawRect 方法的参数 }, // 绘制圆 { type: 'arc', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawArc 方法的参数 }, // 绘制三角形 { type: 'triangle', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawTriangle 方法的参数 }, // 绘制线条 { type: 'line', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawLine 方法的参数 }, // 绘制图片 { type: 'image', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawImage 方法的参数 }, // 绘制二维码 { type: 'qrcode', zIndex: 0, // 绘制顺序 越小越先绘制 // 参数详看draw.drawQrCode 方法的参数 }, // 自定义绘制 { type: 'custom', zIndex: 0, // 绘制顺序 越小越先绘制 // Context: 调用原生方法绘制 // _this: 调用draw类的内置方法绘制 setDarw(Context, _this) { // 原生方法绘制 Context.fillText('你好', 0, 200) // 使用draw类内置方法绘制 _this.drawText({ x: 0, y: 0, text: '你好, 世界' }) } } ] return data }) ```