关于canvas合成分享图
最近在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合成分享图的更多相关文章
- H5项目开发分享——用Canvas合成文字
以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...
- 使用Canvas绘制分享海报
这几天接到一个需求,需要将一个邀请链接转换为一个带有二维码并且能够分享出去的海报图,网上找了很多的方法,也踩了不少的坑,希望大家遇到类似的需求能够少走弯路.. 具体效果图如下: 效果图 首先我采用了 ...
- 微信小程序绘制分享图
微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...
- JavaScript图形实例:合成花卉图
我们知道在直角坐标系中,圆的方程可描述为: X=R*COS(α) Y=R*SIN(α) 用循环依次取α值为0~2π,计算出X和Y,在canvas画布中将坐标点(X,Y)用线连起来,可绘制出一个圆.编写 ...
- 用canvas绘制折线图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用Canvas绘制背景图
原文 http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...
- Android自己定义组件系列【9】——Canvas绘制折线图
有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了非常多插件,可是非常多时候我们须要依据详细项目自己定义这些图表,这一篇文章我们一起来看看怎样在Android中使用Can ...
- <canvas合成海报>所遇问题及解决方案总结
最近做了一个用canvas合成海报图片的移动端项目,由于一点canvas基础都没有,所以去网上搜了一位前辈的demo,但是开发过程中遇到了很多问题,现将所遇问题及解决方法总结如下: 1.移动端canv ...
- 纯Java实现微信朋友圈分享图
纯Java实现微信朋友圈分享图 1.实现分享图的效果 2.开发环境 2.1 JDK * oracle's jdk 1.8以上 2.2 字体 * 若选择了微软雅黑字体又是代码部署到Linux,则需要安装 ...
随机推荐
- Spring MVC内置支持的4种内容协商方式【享学Spring MVC】
每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...
- Java中时间格式处理,指定N天/小时等之后的时间
1)根据当前时间,获取具体的时刻的时间 N天前 M小时之前 可用 new Date().getTime() - 24 * 60 * 60 * 1000*N[N天之前]的方法来获取处理时间之后的具体的值 ...
- CentOS -- Zookeeper installation and configure
1 JDK 1.8 must installed first 2 Get Zookeeper package wget https://archive.apache.org/dist/zookeepe ...
- Codeforces 1009D
题意略. 思路: 可知对于一个拥有n个点的图来说,它至少需要有n - 1条边来维持连通性,而且数字1恰好与后面的n - 1个数字互质: 至于n个点的图可以产生合法的互质边的个数的上限,我们可以通过莫比 ...
- Win10下安装python3.x+pycharm+autopep8
一.安装Python3.X 1.Pythong官方网站:http://python.org/getit/ 下载windows的安装包.有以下几个选项: 这里选择windows x86-64 exc ...
- 洛谷- P1306 斐波那契公约数 - 矩阵快速幂 斐波那契性质
P1306 斐波那契公约数:https://www.luogu.org/problemnew/show/P1306 这道题目就是求第n项和第m项的斐波那契数字,然后让这两个数求GCD,输出答案的后8位 ...
- 分层图 单调决策性DP
easy 写法. #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt" ...
- HDU 5324 Boring Class CDQ分治
题目传送门 题目要求一个3维偏序点的最长子序列,并且字典序最小. 题解: 这种题目出现的次数特别多了.如果不需要保证字典序的话直接cdq就好了. 这里需要维护字典序的话,我们从后往前配对就好了,因为越 ...
- 题解 CF499A 【Watching a movie】
题意 看一部电影,从第一分钟开始看,你每次可以按下快进键,快进x分钟,电影有n个精彩片段,问看到所有精彩片段至少需要看多少分钟电影.(数据保证能看到所有精彩片段) 我们可以发现答案其实 就是间隔时间% ...
- WordCount2.2
说明: 合作者:201631062507 201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam 本次作业链接:https ...