关于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,则需要安装 ...
随机推荐
- DIY显示器篇------DIY教程
前言: DIY显示器是这几年才火起来的,或者说这几年在游戏圈火起来的.我第一次看到是在NGA上,一位玩PUBG的大佬自己DIY了一个显示器,27寸 2k 144 ips的屏幕,当时市面上只有四款显示器 ...
- Suring开发集成部署时问题记录
前言 开发时一定要用管理员模式打开VS或者VSCODE进行开发,同时不要在nuget上直接下载,要去github上下载源代码调试.第一方便调试,第二Surging迭代较快,nuget版本往往不是最新的 ...
- 关于原生js中函数的三种角色和jQuery源码解析
原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...
- 做「容量预估」可没有true和false
如果第二次看到我的文章,欢迎右侧扫码订阅我哟~
- Egret白鹭开发微信小游戏(使用皮肤搭建UI,代码调用组件功能)
(1)新建皮肤,并命名如下 (2)根据实际情况自定义皮肤,例如: (3)修改名字为如下: (4)运行游戏会自动生成以下代码: (5)在default.thm.json中添加如下代码:(具体路径名字根据 ...
- Codeforces 975D
题意略. 思路:我们来写一下公式: P1:(x1 + t * Vx1,y1 + t * Vy1) P2:(x2 + t * Vx2,y2 + t * Vy2) x1 + ...
- 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们!然后今天群里突然有人提出了题目的这个问题:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出 ...
- ASP.NET Core中使用Csp标头对抗Xss攻击
内容安全策略(CSP)是一个增加的安全层,可帮助检测和缓解某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击.这些攻击用于从数据窃取到站点破坏或恶意软件分发的所有内容(深入CSP) 简而言之,CS ...
- HDU 5984 题解 数学推导 期望
Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decorative s ...
- uva 796 C - Critical Links(tarjan求桥)
题目链接:https://vjudge.net/contest/67418#problem/C 题意:求出桥的个数并且按顺序输出 题解:所谓桥就是去掉这条边后连通块增加,套用一下模版就行. #incl ...