# QS-SharePoster
**Repository Path**: QS-UI/QS-SharePoster
## Basic Information
- **Project Name**: QS-SharePoster
- **Description**: No description available
- **Primary Language**: JavaScript
- **License**: BSD-3-Clause
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 2
- **Created**: 2021-03-30
- **Last Updated**: 2024-06-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
---
# [`遇到问题汇总!!!!!!!`](#question)
# [`遇到问题汇总!!!!!!!`](#question)
# [`遇到问题汇总!!!!!!!`](#question)
## QQ交流群: 750104037 [点我加入](https://jq.qq.com/?_wv=1027&k=5OyZoXa)
---
## 作者想说
二维码生成参考了 `诗小柒` 的[二维码生成器](https://ext.dcloud.net.cn/plugin?id=39), 感谢 `诗小柒`!
base64工具使用了 `瞳player` 的[image-tools](https://ext.dcloud.net.cn/plugin?id=123), 感谢 `瞳player`!
也感谢qq:1846492969 的帮助
如果该插件有什么问题还请大家说出来哦,还有如果有什么建议的话也可以提下呐 ~
如果觉得好用,可以回来给个五星好评么~~(❁´◡`❁)\*✲゚\* 蟹蟹~拜托啦~
---
## 组件简介
一款自我感觉良好、实用的海报生成器
---
# 警告
`小程序中请注意自己的获取图片信息的api--getImageInfo 是否正常获取图片信息,否则绘制不出来`
`重要:`如果小程序有绘制微信用户头像需求的, 把https://thirdwx.qlogo.cn、https://wx.qlogo.cn都配置到小程序后台下载域名去
# 兼容性
### APP、微信小程序、H5、支付宝小程序(注意在canvas组件加上id)、其他未测
# 绘制图片类型注意
### 支持 网络图片、base64图片(v3.0.6+, H5、APP、微信小程序), 本地图片最好import一下
# 遇到的问题汇总
* #### 小程序报“request:fail url not in domain list”
> * #### 需要检查报错图片的域名是否在后台已配置(详细检查, 比如是否有绘制微信头像等容易忽略的非自己服务器的图片)
* #### 卡在“准备海报数据”
> * #### 一般是网络图片下载时或获取图片信息时出错,需要调通uni.downloadFile 和 uni.getImageInfo api
* #### 卡在“绘制中”
> * #### 一般是Canvas实例的问题,可以自己在页面生成Canvas实例传入 Context 属性中
> * #### 可以传draw属性为false, 而后在Promise完成状态后自己调用CanvasContext的draw方法绘制
* #### 绘制白图
> * #### 如果是 ios 运行在APP-PLUS, 一般是画布大小超出了Canvas的尺寸限制,影响画布大小的因素有background所设置的大小和backgroundImage背景图片的尺寸
> * #### 有可能是绘制的内容较复杂需要时间,可以设置drawDelayTime来延时生成,单位为毫秒
# 绘制类型大纲
* ### [image-图片](#image)
* ### [text-文本](#text)
* ### [qrcode-二维码](#qrcode)
* ### [custom-自定义绘制](#custom)
* ### v3.0.6 新增
* ### [fillRect-填充矩形](#fillRect)
* ### [strokeRect-线性矩形](#strokeRect)
* ### [roundStrokeRect-线性圆角矩形](#roundStrokeRect)
* ### [roundFillRect-填充圆角矩形](#roundFillRect)
# 1. 必读
## 1.0.0画布相关
```
首先目前有两种方式, 根据背景图绘制和自定义画布绘制,
1、根据背景图绘制
该方式中画布大小跟随背景图大小,而背景图的设置有两种方式:
a、app.js中的getPosterUrl方法获取 (若采用此方法则需自行配置)
b、传参backgroundImage为图片地址
2、自定义画布绘制
该方式需传background属性, 根据其属性控制画布的大小颜色
优先级: background> backgroundImage> app.js-getSharePoster()
注: 所以如果传了backgroundImage就不会去app.js获取背景图片, 如果传了background就不会绘制背景图片
```
# 2.使用概览
## html
```html
```
## js
```javascript
import { getSharePoster } from '@/.../QS-SharePoster.js';
export default {
data () {
return {
poster: {},
}
}
}
```
## 示例
### 1.背景图绘制方式
```javascript
let _this = this;
const d = await getSharePoster({ //return Promise
_this: _this, //若在组件中使用 必传
posterCanvasId: 'canvasId', //canvasId
backgroundImage: '自定义背景图片', //背景图片路径, 画布会跟随图片的实际像素, 并绘制为背景, 请不要使背景图片的像素太大
setCanvasWH({ bgObj }) { //一般必传, 动态设置canvas宽高
_this.poster = bgObj
},
drawArray({ //绘制序列
bgObj, //背景图对象
type, //自定义标识
bgScale, //背景缩放
setBgObj, //动态设置画布(宽高),若使用该方法不建议背景图方式绘制, 建议使用background自定义画布绘制, 因为这个方法绘制修改背景图的宽高
getBgObj //获取动态设置的画布宽高
}) {
//return new Promise((rs, rj)=>{ rs([Obejct, ...]) })
//或者
//return [Obejct, ...]
return [
{
type: 'text', // 绘制类型, 详见上方 绘制类型大纲
//...对应type的属性, 详见下方
text: '123',
dx: 0,
dy: 0
}
]
}
})
```
### 2.自定义画布绘制方式
```javascript
let _this = this;
const d = await getSharePoster({ //return Promise
_this: _this, //若在组件中使用 必传
posterCanvasId: 'canvasId', //canvasId
background: {
height: 200, //画布高度
width: 200, //画布宽度
backgroundColor: '#ffffff', //画布背景颜色
},
setCanvasWH({ bgObj }) { //一般必传, 动态设置canvas宽高
_this.poster = bgObj
},
drawArray({ //绘制序列
bgObj, //背景图对象
type, //自定义标识
bgScale, //背景缩放
setBgObj, //动态设置画布(宽高),若使用该方法不建议背景图方式绘制, 建议使用background自定义画布绘制, 因为这个方法绘制修改背景图的宽高
getBgObj //获取动态设置的画布宽高
}) {
//return new Promise((rs, rj)=>{ rs([Obejct, ...]) })
//或者
//return [Obejct, ...]
return [
{
type: 'text', // 绘制类型, 详见上方 绘制类型大纲
//...对应type的属性, 详见下方
text: '123',
dx: 0,
dy: 0
}
]
}
})
```
# 传入参数详解
`注:所有传入的图片路径都为网络图片`
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| posterCanvasId | 是 | String | | 页面中绘制海报的画布的id |
| type | | all| | 自定义标识,用于逻辑判断 |
| backgroundImage | | String | | 背景图片路径,优先级大于app.js中getPosterUrl方法返回的路径 |
| reserve| | Boolean | false | 本次绘制是否接着上一次绘制 |
| qrCodeArray(`推荐使用drawArray`)| | Array \| Function| | 需绘制的二维码数组,若传入的类型为Function,则可以接收一个对象, 该对象有三个参数,bgObj是背景图片的宽高等信息,type是自定义标识type,bgScale是背景图片宽高缩放比例, 且必须return一个数组,推荐传入Function类型|
| imagesArray(`推荐使用drawArray`)| | Array \| Function | |需绘制的图片数组,若传入的类型为Function,则可以接收一个对象, 该对象有三个参数,bgObj是背景图片的宽高等信息,type是自定义标识type,bgScale是背景图片宽高缩放比例, 且必须return一个数组,推荐传入Function类型|
| setCanvasWH| (一般来说)是| Function | | 动态设置画布宽高的方法,该方法返回一个对象, 该对象有三个参数,bgObj是背景图片的宽高等信息,type是自定义标识type,bgScale是背景图片宽高缩放比例, 可以根据背景图给画布定宽高 |
| setCanvasToTempFilePath| | Object\|Function | | 设置绘制完毕后的生成海报临时路径参数,该参数有默认, 一般可以不用填|
| setDraw(`推荐使用drawArray`)| | Function | | 自定义绘制方法,该方法接收一个对象 |
| background| | Object| | 背景图对象 |
| textArray(`推荐使用drawArray`)| | Array \| Function| | 需绘制的文本数组,若传入的类型为Function,则可以接收两个参数,第一个参数是背景图片的宽高等信息,第二个参数为自定义标识type , 且必须return一个数组,推荐传入Function类型 |
| bgScale| | Number | 0.75| 为了IOS能正常绘制对背景图进行缩放,取值(0,1), 若IOS还是绘制不出可以 尝试下调此参数 |
| Context| | CanvasContext| | 画布对象,一般不用 |
| `v3.0.0更新` | | | | `v3.0.0开始推荐使用drawArray绘制, 不需要再用其他的xxxArray绘制了`|
| drawArray| | Array \| Function| | 可控层级的绘制序列, 层级的顺序就是数组的顺序, 可直接return数组,也可以return一个promise对象, 但最终resolve一个数组, 这样就可以方便实现后台可控绘制海报 |
| delayTimeScale| | Number| 15| 根据绘制序列每一项延时该参数的时间 |
| drawDelayTime| | Number| 100| draw方法延时时间|
| _this| | Vue | | 传入当前vue实例this指向, 组件中使用时必传|
| `v3.0.1更新` | | | | |
| formData| | Any | | app.js中的getPosterUrl方法可获得该属性 用于获取背景图时携带的自定义数据|
| `v3.1.1更新` | | | | |
| canvas2image| | Boolean | | 是否自动调用uni.canvasToTempFilePath生成并返回图片路径|
| `v3.1.3更新` | | | | |
| draw| | Boolean | | 是否自动调用CanvasContext.draw而进行后续操作|
## background参数详解
```
该参数传入一个对象,若无背景为图片的需求可用此属性设置画布背景的大小、颜色等, 若传该属性, 则不会去获取背景图片了
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| width| | Number| | 背景宽度|
| height| | Number| | 背景高度|
| backgroundColor| | Color| black | 背景颜色 |
## setCanvasWH参数详解
```
该参数传入一个方法,该方法返回两个参数,接收的第一个参数为背景图片的信息, 第二个参数是自定义标识)
注: 确保能够改变画布大小,不然会有问题
```
示例代码:
```javascript
setCanvasWH: ({bgObj, type, bgScale}) => { // 为动态设置画布宽高的方法,
this.poster = bgObj;
},
```
## setCanvasToTempFilePath参数详解
```
该参数传入一个方法,该方法返回两个参数,接收的第一个参数为背景图片的信息, 第二个参数是自定义标识)
该参数有默认, 一般可以不用填
必须return一个对象, 格式: (与官方文档中的setCanvasToTempFilePath方法传入的参数基本一致,除了canvasid与回调函数不用传)
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| x| | Number | | 画布x轴起点(默认0) |
| y| | Number| | 画布y轴起点(默认0) |
| width| | Number| | 画布宽度(默认为canvas宽度-x)|
| height| | Number| | 画布高度(默认为canvas高度-y) |
| destWidth| | Number| | 输出图片宽度(默认为 width * 屏幕像素密度) |
| destHeight| | Number| | 输出图片高度(默认为 height * 屏幕像素密度) |
| fileType| | String| jpg| 目标文件的类型,只支持 'jpg' 或 'png' |
| quality| | Number| .8 | 图片的质量,取值范围为 (0, 1],不在范围内时当作1.0处理 |
注:v11.0版本后该参数为拓展覆盖,所以无需所有参数都传
## drawArray参数详解
```
该参数可以是一个数组,也可以是一个方法, `若传入一个方法,则必须return一个数组`, 也允许返回promise对象
数组中的项内属性:
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| `v3.0.1更新` | | | | |
| allInfoCallback | | Function| | 该参数传入一个方法,该方法接收一个对象,该对象目前包含一个drawArray属性, 可以获取全部的drawArray的详细参数, 该方法可以return一个对象或promise对象,最终输出一个对象, 该对象的属性将会覆盖原属性|
| serialNum| | Number| -∞| 用于控制序列中allInfoCallback的顺序, 数值越小, 越先获取|
| `over` | | | | |
| `v3.1.3更新` | | | | |
| zIndex| | Number| -∞| 在allInfocallback完成后,会再次以此参数排序, 数值越大层级越高|
| `over` | | | | |
| type| 是| String| | 绘制类型, 可选值 'text'、'image'、'qrcode'、'custom'|
| `type为text时`| | | | |
|... | | | | 参数详见[`text`](#text) |
| `type为image时`| | | | |
|... | | | | 参数详见[`image`](#image) |
| `type为qrcode时`| | | | |
|... | | | | 参数详见[`qrcode`](#qrcode) |
| `type为custom时`| | | | 参数详见[`custom`](#custom) |
| setDraw| | | | 该属性传入一个方法,接收一个参数-画布对象,可在方法中自定义绘制内容|
| `v3.0.6更新` | | | | |
| `type为fillRect时`| | | | |
|... | | | | 参数详见[`fillRect`](#fillRect) |
| `type为strokeRect时`| | | | |
|... | | | | 参数详见[`strokeRect`](#strokeRect) |
| `type为roundStrokeRect时`| | | | |
|... | | | | 参数详见[`roundStrokeRect`](#roundStrokeRect) |
| `type为roundFillRect时`| | | | |
|... | | | | 参数详见[`roundFillRect`](#roundFillRect) |
注: 当drawArray为function时,v3.0.5新增setBgObj与getBgObj方法,详见示例项目
## qrCode类型参数详解
```
该参数可以是一个数组,也可以是一个方法, `若传入一个方法,则必须return一个数组`
数组中的项内属性: (基本与诗小柒的二维码生成器传入参数差不多,就是多了dx、dy)
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| text| 是 | String | | 二维码内容 |
| size| | Number| | 二维码大小 |
| dx| | Number| | 二维码在x轴上的位置 |
| dy| | Number| | 二维码在y轴上的位置 |
| background| | String | | 二维码背景色 |
| foreground| | String | | 二维码前景色 |
| correctLevel| | Number | | 二维码容错级别 |
| image| | String | | 二维码中心的图片 |
| imageSize| | Number | | 二维码图标大小 |
## image类型参数详解
```
该参数可以是一个数组,也可以是一个方法, `若传入一个方法,则必须return一个数组`
数组中的项内属性: (与官方文档中的drawImage方法传入的参数一致,一般最多填前5个参数)
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| url| 是 | String | | 网络图片路径 |
| dx| | Number| | 图像的左上角在目标canvas上 X 轴的位置 |
| dy| | Number| | 图像的左上角在目标canvas上 Y 轴的位置 |
| dWidth| | Number| | 在目标画布上绘制图像的宽度,允许对绘制的图像进行缩放 |
| dHeight| | Number| | 在目标画布上绘制图像的高度,允许对绘制的图像进行缩放 |
| sx| | Number| | 源图像的矩形选择框的左上角 X 坐标 |
| sy| | Number| | 源图像的矩形选择框的左上角 Y 坐标 |
| sWidth| | Number| | 源图像的矩形选择框的高度 |
| sHeight| | Number| | 源图像的矩形选择框的高度 |
| circleSet(5.0新增)| | Object\|Boolean | | 图片圆形设置 |
| infoCallBack (4.0新增)| | Function| | 接收自身图片信息并返回新参数的回调函数 |
| roundRectSet(v16.0新增)| | Object\|Boolean | | 圆角矩形图片设置 |
| `v3.0.1 新增`| | | | |
| alpha| | Number | 1| 图片的透明度, 取值: [0, 1] |
| `v3.0.8 新增`| | | | |
| mode| | String | scaleToFill| 同uni image组件的mode属性, 目前支持 scaleToFill、aspectFit、aspectFill |
### circleSet属性详解
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| ~~circle~~ `废弃`| | Boolean| | 是否设置圆形 |
| r| | Number| 详见下方 | 圆形半径 |
| x| | Number| 详见下方 | 圆形x坐标 |
| y| | Number| 详见下方 | 圆形y坐标 |
注: r、x、y的值最终会传至Context.arc()方法, 并都有默认值,详见下方
### r、x、y默认值详解
r的默认值先判断是否有dWidth和dHeight,若有则取两者之间值较小的, 若无,则判断img自身的宽高取两者之间较小的,最终除以2
x的默认值为(dx || 0 + r)
y的默认值为(dy || 0 + r)
### roundRectSet属性详解
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| r| | Number| 输出的图片宽度*.1 | 圆角半径 |
## custom类型详解
```javascript
{
type: 'custom',
setDraw: (Context) => {
Context.setFillStyle('black');
Context.setGlobalAlpha(0.3);
Context.fillRect(0, bgObj.height - 400, bgObj.width, 400);
Context.setGlobalAlpha(1);
Context.setFillStyle('white');
Context.setFontSize(50);
let text = '取舍'
Context.fillText(text, bgObj.width - text.length * 50 - 50, bgObj.height - 185);
}
}
```
## text类型参数详解
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| text| 是| String| | 需绘制的文本|
| size| | Number| 50 | 文字大小, `设置的文字若携带小数, 会向上取整`|
| color| | Color| black | 文字颜色 |
| alpha| | Number| 1| 透明度, 取值[0, 1] |
| textAlign| | String| left| 文字的x轴对齐模式, 可选值: 'left'、'center'、'right' |
| textBaseline| | String| middle| 文字的y轴对齐模式, 可选值: 'top'、'bottom'、'middle'、'normal' |
| dx| | Number| 0| 文字x轴位置 |
| dy| | Number| 0| 文字y轴位置 |
| lineThrough| | Object\|Boolean | | 设置删除线|
| infoCallBack| | Function| | 携带文本长度值的方法, 可以return一个对象,内含自身属性,并覆盖|
| lineFeed(v13.0新增)| | Object| | 设置换行|
|`v19.0新增`| | | | |
| font | | String | 10px sans-serif | 字体属性, 若填此参数将忽略下方四个参数, 注意 字体大小需为整数 |
| fontStyle | | String | normal | 字体样式|
| fontVariant| | String | normal | 字体异体|
| fontWeight| | String | normal | 字体粗细 |
| fontFamily| | String | sans-serif| 字体系列 |
### lineThrough参数详解
```
用于设置删除线, v3.1.7+ 可直接传true
传入参数如下:
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| width| | Number| (本身设置中中设置的size)/10 | 删除线宽度|
| style| | Color|本身设置中中设置的color| 删除线颜色 |
| alpha| | Number| 本身设置中中设置的alpha| 透明度, 取值[0, 1] |
| cap| | String| butt| 设置线条的端点样式 |
### lineFeed参数详解
```
用于设置换行
传入参数如下:
```
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| maxWidth| | Number| 画布宽度 | 设置单行最大宽度|
| lineHeight| | Number| 本身设置中中设置的size|行高, 一般要大于设置的字体大小 |
| lineNum| | Number| -1| 最多行数,若小于零则为无限 |
| dx| | Number|本身设置中中设置的dx| 换行后的x轴位置,不包含第一行,若小于零则为本身设置中设置的dx |
| `v3.1.7+` lastLineMaxWidth | | Number|本身设置中中设置的maxWidth| 换行后大于1行时, 最后一行的最大宽度 |
### fontStyle 参数详解
| 属性名 | 说明 |
| --------- | ---- |
| normal | 默认值。标准的字体样式 |
| italic | 斜体的字体样式 |
| oblique | 倾斜的字体样式 |
### fontVariant参数详解
| 属性名 | 说明 |
| --------- | ---- |
| normal | 默认值。标准的字体 |
| small-caps | 小型大写字母的字体 |
### fontWeight参数详解
| 属性名 | 说明 |
| --------- | ---- |
| normal | 默认值。定义标准的字符。 |
| bold | 定义粗体字符。 |
## fillRect类型(填充直角矩形)
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| backgroundColor| | Color| | 填充颜色|
| alpha| | Number| 1 | 透明度, 取值[0, 1]|
| dx| | Number| 0 | x轴位置 |
| dy| | Number| 0| y轴位置 |
| width| | Number| 0| 宽度 |
| height| | Number| 0| 高度 |
## strokeRect类型(线性直角矩形)
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| color| | Color| | 线条颜色|
| lineWidth| | Number| | 线条宽度|
| dx| | Number| 0 | x轴位置 |
| dy| | Number| 0| y轴位置 |
| width| | Number| 0| 宽度 |
| height| | Number| 0| 高度 |
## roundStrokeRect类型(线性圆角矩形)
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| color| | Color| | 线条颜色|
| lineWidth| | Number| | 线条宽度|
| r| | Number| this.width*.1 | 圆角大小|
| dx| | Number| 0 | x轴位置 |
| dy| | Number| 0| y轴位置 |
| width| | Number| 0| 宽度 |
| height| | Number| 0| 高度 |
## roundFillRect类型(填充圆角矩形)
| 属性名 | 是否必填 | 值类型 | 默认值 | 说明 |
| --------- | -------- | -----: | --: | --: |
| backgroundColor| | Color| | 填充颜色|
| r| | Number| this.width*.1 | 圆角大小|
| dx| | Number| 0 | x轴位置 |
| dy| | Number| 0| y轴位置 |
| width| | Number| 0| 宽度 |
| height| | Number| 0| 高度 |