最近在uni-app项目中遇到一个合成分享图的需求,其实最开始是用原生写法来做的,后来发现在PC端测试是可以的,但在APP模拟器中会出现问题,可能是因为两者的js环境不同吧,uni-app官网也说了这两者不能等同

先来看看最开始写的原生方法

 // 获取下载链接
getDownloadLink() {
this.$axios
.get('/app/address')
.then(res => {
console.log(res)
this.downloadLink = res.data.data
// 转二维码
this.makeCode()
})
.catch(err => {
console.log(err);
});
},
// 链接转二维码
makeCode(){
let img = QR.createQrCodeImg(this.downloadLink,{'size':300});
this.downloadImg = img
console.log(img)
console.log(this.detailsData.banners[0]) },
// 商品分享图片合成
starDraw() {
let _that = this
let base64Img1 = 'data:image/gif;base64,'.concat(this.detailsData.bannersBase64[0])
console.log(base64Img1)
// console.log('data:image/gif;base64,'.concat(this.detailsData.bannersBase64[0]))
// return
var data = [base64Img1, this.downloadImg]
var base64 = []
var bigName = 'F.N次方'
var starName = this.detailsData.name
if(this.detailsData.lowestPrice === this.highestPrice){
var price = '¥' + this.detailsData.lowestPrice
}else{
var price = '¥' + this.detailsData.lowestPrice + '~' + this.detailsData.highestPrice }
console.log(this.detailsData.banners[0])
console.log(price)
var c = document.createElement('canvas'),
// var c = this.$refs.canvas
ctx = c.getContext('2d'),
len = data.length
c.width = 300
c.height = 450
ctx.rect(0, 0, 300, 300)
ctx.fillStyle = '#fff'
ctx.fill()
function drawing(n) {
if (n < len) {
var img = new Image
// img.setAttribute("crossOrigin",'Anonymous')
// img.crossOrigin = 'Anonymous'; //解决跨域
img.crossOrigin = 'Anonymous'
img.src = data[n]
img.onload = function () {
if (n == 1) {
ctx.fillRect(0, 300, 300, c.height-300)
ctx.fillStyle = '#fff'
ctx.drawImage(img, c.width-110, 330, 100, 100);
console.log(1)
ctx.font = '14px sans-serif'
ctx.textBaseline = 'top'
ctx.textAlign = 'start'
ctx.fillStyle = '#000'
ctx.fillText(bigName,10,320)
ctx.fillText(starName, 10, 340)
ctx.font = '14px sans-serif'
ctx.fillStyle = 'red'
ctx.fillText(price, 10, 380)
console.log(2)
} else {
ctx.drawImage(img, 0, 0, c.width, c.height)
}
drawing(n + 1);
}
} else {
//保存生成作品图片
base64.push(c.toDataURL());
_that.base64Data = base64[0]
console.log(_that.base64Data)
// fn();
}
}
drawing(0);
}

这种事原生写法,在浏览器中测试能通过,但APP中会出错

下面来看看使用uni-app的方法来解决的

 copyFn() {
let that = this
var goodsName = this.detailsData.name
var text = 'F.N'
if(this.detailsData.lowestPrice === this.highestPrice){
var price = '¥' + this.detailsData.lowestPrice
}else{
var price = '¥' + this.detailsData.lowestPrice + '~' + this.detailsData.highestPrice }
let ww, hh;
let base64Img1 = 'data:image/gif;base64,'.concat(this.detailsData.bannersBase64[0])
const query = uni.createSelectorQuery().in(this);
query.select('#sss').boundingClientRect(data => { //获取canvas-dom
ww = data.width; //准确的宽高
hh = 450
var ctx = uni.createCanvasContext('myCanvas') //绑定画布
ctx.drawImage(base64Img1, 0, 0, ww, 300); //填充进图片
// this.downloadImg
ctx.setFillStyle('#000') //设置内容1的文字样式
ctx.setFontSize(20);
ctx.rect(0, 300, ww, 300)
ctx.setFillStyle('#fff')
ctx.fill()
ctx.drawImage(that.downloadImg, 240, 360, 100, 100)
// ctx.setTextAlign('center')
ctx.setFillStyle('#000')
ctx.fillText(text,50,hh/2+120)
// ctx.setTextAlign('center')
ctx.fillText(goodsName,50,hh/2+150)
ctx.setFillStyle('red')
ctx.setFontSize(16);
ctx.fillText(price,50,hh/2+180)
ctx.draw(); //输出到画布中
uni.showLoading({ //增加loading等待效果
mask:true
})
setTimeout(()=>{ //不加延迟的话,有时候会赋予undefined
uni.canvasToTempFilePath({
canvasId:'myCanvas',
success: (res) => {
console.log(res.tempFilePath)
this.shareImage=res.tempFilePath
}
})
uni.hideLoading();
},3000)
}).exec(); }

这样就能解决APP中报错的问题,然后再通过调用uni-app分享接口将合成图分享出去

关于canvas合成分享图的更多相关文章

  1. H5项目开发分享——用Canvas合成文字

    以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...

  2. 使用Canvas绘制分享海报

    这几天接到一个需求,需要将一个邀请链接转换为一个带有二维码并且能够分享出去的海报图,网上找了很多的方法,也踩了不少的坑,希望大家遇到类似的需求能够少走弯路.. 具体效果图如下: 效果图 首先我采用了 ...

  3. 微信小程序绘制分享图

    微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...

  4. JavaScript图形实例:合成花卉图

    我们知道在直角坐标系中,圆的方程可描述为: X=R*COS(α) Y=R*SIN(α) 用循环依次取α值为0~2π,计算出X和Y,在canvas画布中将坐标点(X,Y)用线连起来,可绘制出一个圆.编写 ...

  5. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 使用Canvas绘制背景图

    原文  http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...

  7. Android自己定义组件系列【9】——Canvas绘制折线图

    有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了非常多插件,可是非常多时候我们须要依据详细项目自己定义这些图表,这一篇文章我们一起来看看怎样在Android中使用Can ...

  8. <canvas合成海报>所遇问题及解决方案总结

    最近做了一个用canvas合成海报图片的移动端项目,由于一点canvas基础都没有,所以去网上搜了一位前辈的demo,但是开发过程中遇到了很多问题,现将所遇问题及解决方法总结如下: 1.移动端canv ...

  9. 纯Java实现微信朋友圈分享图

    纯Java实现微信朋友圈分享图 1.实现分享图的效果 2.开发环境 2.1 JDK * oracle's jdk 1.8以上 2.2 字体 * 若选择了微软雅黑字体又是代码部署到Linux,则需要安装 ...

随机推荐

  1. 2019牛客暑期多校训练营(第十场)J - Wood Processing (斜率优化DP)

    >传送门< 题意 $n$个宽度为$w_{i}$,高为$h_{i}$ 的 木块,要求分成$k$组,对于每组内的所有木块,高度都变为组内最低木块的高度,宽度保持不变,求变化的最小面积. 分析 ...

  2. JavaScrip数据类型

    数据类型: 基础数据类型: Number String Boolean Undefined Null 引用数据类型: Object Symbol

  3. JAVA通过HTTP方式获取数据

    测试获取免费天气数据接口:http://www.weather.com.cn/data/sk/101190408.html URL数据如下图: 代码部分: package https; import ...

  4. linux 7忘记密码找回

    一.linux 7忘记密码二种更改方法 centos7/rhel7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ctrl+x引导.重置密码主要有rd.break和init两种方法. ...

  5. ForkJoinPool 分支/合并框架

    ForkJoinPool 分支/合并框架 一.Fork/Join框架简介 Fork/Join 框架就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小 ...

  6. SpringBoot_@valid_参数校验

    SpringBoot @valid 参数校验 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不 ...

  7. 前端测试工具之 postman

    1.不论你是一个前端工程师还是一个后端工程师相信这款工具都会使你的开发更加简便. 2.在此我推荐的一款软件工具是 postman . 在这里我对 postman 做一个简单的介绍: ①它能够模拟表单发 ...

  8. Bootstrap如何禁止响应式布局

    Bootstrap 会自动帮你针对不同的屏幕尺寸调整你的页面,使其在各个尺寸的屏幕上表现良好.下面我们列出了如何禁用这一特性,就像这个非响应式布局实例页面一样. 禁止响应式布局有如下几步: 移除 此 ...

  9. codeforces 161 D. Distance in Tree(树形dp)

    题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...

  10. HDU 5793 A Boring Question 多校训练

    There are an equation. ∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1000000007=?∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1 ...