知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >
小程序canvas生成海報(bào)
發(fā)表時(shí)間:2020-9-29
發(fā)布人:葵宇科技
瀏覽次數(shù):95
小程序canvas生成海報(bào)
- 先看看效果圖 以下↓
- 使用場(chǎng)景
- 前提
- wxml
- js
- drawCanvas.js
- 在Canvas.js引入drawCanvas.js
- 希望大家能夠用到!
如果文章中有出現(xiàn)紕漏、錯(cuò)誤之處,還請(qǐng)看到的小伙伴多多指教,先行謝過(guò)
先看看效果圖 以下↓
使用場(chǎng)景
- 分享小程序的,繪制分享圖
- 不同商品分享的是后生成不同的圖片,每個(gè)商品的信息圖片不同,小程序默認(rèn)分享的是頁(yè)面默認(rèn)截圖
- 小程序分享朋友圈,生成海報(bào)
前提
- 根據(jù)上面圖片需要一個(gè)背景圖片(上面是750*777),大家可根據(jù)實(shí)際情況進(jìn)行改變
- 本文用的是小程序canvas最新api,大家可以閱讀小程序canvas文檔
wxml
<canvas style="width:750px;height:777px;position:absolute;top:0px;left:-2000px;" id="canvas" type="2d"></canvas>
js
drawCanvas.js
[單獨(dú)創(chuàng)建drawCanvas.js存放一些公共函數(shù),里面封裝了圖片渲染文字換行等一些方法(由于畫(huà)布無(wú)法直接使用網(wǎng)絡(luò)圖片,所以需要 wx.downloadFile或者wx.getImageInfo把它下載回來(lái)才能使用,本文使用wx.downloadFile)]
export default {
// 下載圖片函數(shù)
downloadImg(img) {
return new Promise((resolve, reject) => {
//將網(wǎng)絡(luò)圖片轉(zhuǎn)成本地路徑
// wx.getImageInfo({
// src: img,
// success: function (res) {
// resolve(res.path)
// }
// })
//方法二
wx.downloadFile({
url: img,
success: (res) => {
let cover = res.tempFilePath;
resolve(cover)
},
fail: (err) => {
reject(err)
},
})
})
},
//圖片渲染
drawImage(canvas, ctx, imgUrl, x, y, w, h) {
ctx.save();
const img = canvas.createImage();
img.src = imgUrl
img.onload = () => ctx.drawImage(img, x, y, w, h);
ctx.closePath();
},
//文字換行
drawTxt: function (ctx, _str, _x, _y, _total, _lineh, _linenum) {
if (_str == "" || _str == undefined) {
return;
}
var total = _total ? _total : 15; //每行字?jǐn)?shù)(數(shù)字算半個(gè))
var lineH = _lineh ? _lineh : 20; //行間距
var lineNum = _linenum ? _linenum : 4; //最大顯示行數(shù)
/*
拆解字符串到數(shù)組,按行,每行15個(gè)(判斷數(shù)字占半個(gè),其他占1個(gè))
*/
var lineArray = [];
var len = 0; //數(shù)字算半個(gè),中文算一個(gè)
for (var i = 0; i < _str.length; i++) {
var line = '';
if (Math.ceil(len) % total == 0) {
if (lineArray[lineArray.length - 1] != "") {
lineArray.push("");
}
}
var index = Math.floor(len / total); //
lineArray[index] = lineArray[index] + _str[i];
if (!isNaN(_str[i])) {
//是數(shù)字
len = len + 0.5;
} else {
len = len + 1;
}
}
for (var i = 0; i < lineArray.length; i++) {
var t_str = lineArray[i];
if (lineArray.length > lineNum && i == (lineNum - 1)) {
//如果總行數(shù)大于設(shè)定的行數(shù),則到最大設(shè)定行時(shí),加省略號(hào),退出
t_str = t_str + '...'
ctx.fillText(t_str, _x, _y + lineH * i);
break;
} else {
ctx.fillText(t_str, _x, _y + lineH * i);
}
}
},
//裁切圓角
drawRoundRect: function (cxt, x, y, width, height, radius) {
cxt.save()
cxt.beginPath();
cxt.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
cxt.lineTo(width - radius + x, y);
cxt.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
cxt.lineTo(width + x, height + y - radius);
cxt.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
cxt.lineTo(radius + x, height + y);
cxt.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
cxt.closePath();
}
}
在Canvas.js引入drawCanvas.js
import drawCanvas from 'drawCanvas.js';
Page(Object.assign({},drawCanvas, {
/**
* 頁(yè)面的初始數(shù)據(jù)
*/
data: {
canvasImg: 'https://dss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=2635355882,2630309952&fm=218&app=2&f=JPEG?w=121&h=75&s=FF7204C5C0615D0773AD7CD103003098' // 實(shí)例
},
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
*/
>: function (options) {
this.shareCreate()
},
//分享微信朋友圈
async shareCreate() {
var self = this;
//self.downloadImg是drawCanvas.js里面方法
let imgUrl = await self.downloadImg(self.data.canvasImg);
wx.nextTick(() => { self.drawAll(imgUrl) })
},
drawAll(imgUrl) {
const query = wx.createSelectorQuery()
const node = query.select('#canvas').node();
var self = this;
node.exec(async res => {
const canvas = res[0].node;
//設(shè)置寬高
canvas.width = canvas._width
canvas.height = canvas._height
const ctx = canvas.getContext('2d');
//背景圖
await self.drawImage(canvas, ctx, "/images/shareImg.png", 0, 0, 750, 777);
//cover
await self.drawImage(canvas, ctx, imgUrl, 0, 0, 750, 460);
//logo
await self.drawImage(canvas, ctx, imgUrl, 50, 525, 363, 45);
setTimeout(async () => {
//背景透明
ctx.fillStyle = 'rgba(0, 0, 0, 0.6)';
ctx.fillRect(0, 0, 750, 460);
//繪制空心矩形
ctx.strokeStyle = 'rgba(0, 0, 0, 0.6)';
ctx.strokeRect(0, 0, 750, 460);
ctx.save();
//title
ctx.textAlign = 'left';
ctx.fillStyle = 'rgba(255, 255, 255, 1)';
ctx.font = "normal bold 41px PingFangSC-Regular";
self.drawTxt(ctx, "測(cè)試卡片", 50, 390, 30, 50, 1);
//desc
ctx.textAlign = 'left';
ctx.fillStyle = "#1e1e1e";
ctx.font = "normal normal 28px PingFangSC-Regular";
self.drawTxt(ctx, "測(cè)試卡片測(cè)試卡片測(cè)試卡測(cè)試卡片片測(cè)試卡片測(cè)試卡片測(cè)試卡片測(cè)試卡片測(cè)試卡片測(cè)試卡片片測(cè)試卡片測(cè)試卡片", 159, 661, 18, 43, 2);
//裁切圓角
self.drawRoundRect(ctx, 50, 625, 92, 92, 46);
ctx.clip();
ctx.stroke();
//頭像
await self.drawImage(canvas, ctx, imgUrl, 50, 625, 92, 92);
ctx.restore();
ctx.closePath();
//canvas轉(zhuǎn)成圖片
self.previewHB(canvas)
}, 500)
})
},
//圖片預(yù)覽
previewHB(canvas) {
var self = this;
wx.nextTick(() => {
//轉(zhuǎn)換圖片
wx.canvasToTempFilePath({
canvas: canvas,
success:async (res)=> {
let img=res.tempFilePath
//預(yù)覽
wx.previewImage({
urls: [img]
})
}
})
})
},
}})
希望大家能夠用到!
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站建設(shè)制作
- 服務(wù)器
- 關(guān)鍵詞快速排名
- 云南小程序制作
- 網(wǎng)站制作哪家好
- 做網(wǎng)站
- 曲靖小程序開(kāi)發(fā)
- 報(bào)廢車回收
- 小程序被騙
- 云南網(wǎng)站制作哪家好
- 小程序公司
- 政府網(wǎng)站建設(shè)服務(wù)
- 買小程序被騙
- 百度快速排名
- web前端
- 云南網(wǎng)站建設(shè)高手
- 網(wǎng)站建設(shè)公司哪家好
- 云南網(wǎng)站開(kāi)發(fā)哪家好
- 生成海報(bào)
- 麗江小程序開(kāi)發(fā)
- 網(wǎng)站排名優(yōu)化
- 微信分銷系統(tǒng)
- 昆明小程序代建
- 網(wǎng)站建設(shè)高手
- 開(kāi)發(fā)制作小程序
- 昆明小程序開(kāi)發(fā)
- 汽車報(bào)廢系統(tǒng)
- 網(wǎng)絡(luò)公司排名
- 云南做百度小程序的公司
- 百度小程序