知è˜
ä¸ç®¡æ˜¯ç¶²(wÇŽng)站,軟件還是å°ç¨‹åºï¼Œéƒ½è¦ç›´æŽ¥æˆ–間接能為您產(chÇŽn)生價值,我們在追求其視覺表ç¾(xià n)çš„åŒæ™‚,更å´(cè)é‡äºŽåŠŸèƒ½çš„ä¾¿æ·ï¼Œç‡ŸéŠ·çš„ä¾¿åˆ©ï¼Œé‹ç‡Ÿçš„高效,讓網(wÇŽng)ç«™æˆç‚ºç‡ŸéŠ·å·¥å…·ï¼Œè®“è»Ÿä»¶èƒ½åˆ‡å¯¦æå‡ä¼æ¥(yè)å…§(nèi)éƒ¨ç®¡ç†æ°´å¹³å’Œæ•ˆçŽ‡ã€‚å„ª(yÅu)秀的程åºç‚ºåŽæœŸå‡ç´šæä¾›ä¾¿æ·çš„æ”¯æŒï¼
您當å‰ä½ç½®>é¦–é » æ–°èžè³‡è¨Š » å°ç¨‹åºç›¸é—œ(guÄn) >
å°ç¨‹åºå¦‚ä½•ç”Ÿæˆæµ·å ±åˆ†äº«æœ‹å‹åœˆ
發(fÄ)表時間:2021-1-5
發(fÄ)布人:葵宇科技
ç€è¦½æ¬¡æ•¸(shù):52
é …ç›®éœ€æ±‚å¯«å®Œæœ‰ä¸€æ®µæ™‚é–“äº†ï¼Œä½†æ˜¯é‚„æ˜¯æƒ³å›žéŽä¾†ç¸½çµ(jié)一下,一是å°é …目的回顧優(yÅu)化ç‰ï¼ŒäºŒæ˜¯å°å‘的地方åšå€‹è¨˜éŒ„,é¿å…以åŽé‡åˆ°é¡žä¼¼çš„å•題。
需求
利用微信強大的社交能力通éŽå°ç¨‹åºé”åˆ°è£‚è®Šçš„ç›®çš„ï¼Œæ‹‰å–æ–°ç”¨æˆ¶ã€‚
生æˆçš„æµ·å ±å¦‚下
需求分æž
1ã€åˆ©ç”¨å°ç¨‹åºå®˜æ–¹æä¾›çš„apiå¯ä»¥ç›´æŽ¥åˆ†äº«è½‰(zhuÇŽn)發(fÄ)到微信群打開å°ç¨‹åº
2ã€åˆ©ç”¨å°ç¨‹åºç”Ÿæˆæµ·å ±ä¿å˜åœ–片到相冊分享到朋å‹åœˆï¼Œç”¨æˆ¶é•·æŒ‰è˜åˆ¥äºŒç¶ç¢¼é—œ(guÄn)注公眾號或者打開å°ç¨‹åºä¾†é”到裂變的目的
實ç¾(xià n)方案
一ã€åˆ†æžå¦‚何實ç¾(xià n)
相信大家應(yÄ«ng)該都會有類似的迷惑,就是如何按照產(chÇŽn)å“è¨(shè)è¨ˆçš„é‚£æ¨£ç¹ªåˆ¶æˆæµ·å ±ï¼Œå…¶å¯¦ç•¶æ™‚我也是ä¸çŸ¥é“如何下手,èªçœŸæƒ³äº†ä¸‹å¾—通éŽcanvas繪制æˆåœ–片,這樣用戶ä¿å˜é€™å€‹åœ–片到相冊,就å¯ä»¥åˆ†äº«åˆ°æœ‹å‹åœˆäº†ã€‚但是è¦ç¹ªåˆ¶çš„圖片上é¢ä¸åƒ…有文å—還有數(shù)å—ã€åœ–片ã€äºŒç¶ç¢¼ç‰ä¸”éƒ½æ˜¯æ´»çš„ï¼Œé€™å€‹è¦æ€Žä¹ˆå‹•æ…‹(tà i)生æˆå‘¢ã€‚èªçœŸæƒ³äº†ä¸‹ï¼Œéœ€è¦ä¸€é»žä¸€é»žçš„將文å—和數(shù)å—,背景圖繪制到畫布上去,這樣通éŽapiæœ€çµ‚åˆæˆä¸€å€‹åœ–片導(dÇŽo)出到手機相冊ä¸ã€‚
二ã€éœ€è¦è§£æ±ºçš„å•題
1ã€äºŒç¶ç¢¼çš„å‹•æ…‹(tà i)ç²å–和繪制(包括如何生æˆå°ç¨‹åºäºŒç¶ç¢¼ã€å…¬çœ¾è™ŸäºŒç¶ç¢¼ã€æ‰“é–‹ç¶²(wÇŽng)é 二ç¶ç¢¼ï¼‰
2ã€èƒŒæ™¯åœ–如何繪制,ç²å–圖片信æ¯
3ã€å°‡ç¹ªåˆ¶å®Œæˆçš„圖片ä¿å˜åˆ°æœ¬åœ°ç›¸å†Š
4ã€è™•ç†ç”¨æˆ¶æ˜¯å¦å–消授權(quán)ä¿å˜åˆ°ç›¸å†Š
三ã€å¯¦ç¾(xià n)æ¥é©Ÿ
這里我具體寫下åœç¹žä¸Šé¢æ‰€æå‡ºçš„å•題,æè¿°å¤§æ¦‚實ç¾(xià n)çš„éŽç¨‹
①首先創(chuà ng)建canvas畫布,我把畫布定ä½è¨(shè)æˆè² çš„,是為了ä¸è®“它顯示在é é¢ä¸Š,æ˜¯å› ç‚ºæˆ‘å˜—è©¦æŠŠcanvas通éŽåˆ¤æ–·æ¢ä»¶å‹•æ…‹(tà i)的顯示和隱è—,在繪制的時候會出ç¾(xià n)å•題,所以采用了這種方法,這里還有一定è¦è¨(shè)置畫布的大å°ã€‚
<canvas canvas-id="myCanvas" style="width: 690px;height:1085px;position: fixed;top: -10000px;"></canvas>
②創(chuà ng)建好畫布之åŽï¼Œå…ˆç¹ªåˆ¶èƒŒæ™¯åœ–ï¼Œå› ç‚ºèƒŒæ™¯åœ–æˆ‘æ˜¯æ”¾åœ¨æœ¬åœ°ï¼Œæ‰€ä»¥ç²å– <canvas> 組件 canvas-id 屬性,通éŽcreateCanvasContext創(chuà ng)建canvas的繪圖上下文 CanvasContext å°è±¡ã€‚使用drawImage繪制圖åƒåˆ°ç•«å¸ƒï¼Œç¬¬ä¸€å€‹åƒæ•¸(shù)是圖片的本地地å€ï¼ŒåŽé¢å…©å€‹åƒæ•¸(shù)是圖åƒç›¸å°ç•«å¸ƒå·¦ä¸Šè§’ä½ç½®çš„x軸和y軸,最åŽå…©å€‹åƒæ•¸(shù)是è¨(shè)置圖åƒçš„寬高。
const ctx = wx.createCanvasContext('myCanvas')
ctx.drawImage('/img/study/shareimg.png', 0, 0, 690, 1085)
③創(chuà ng)建好背景圖åŽï¼Œåœ¨èƒŒæ™¯åœ–上繪制é åƒï¼Œæ–‡å—和數(shù)å—。通éŽgetImageInfoç²å–é åƒçš„ä¿¡æ¯ï¼Œé€™é‡Œéœ€è¦æ³¨æ„下在ç²å–的網(wÇŽng)絡(luò)圖片è¦å…ˆé…ç½®downloadåŸŸåæ‰èƒ½ç”Ÿæ•ˆï¼Œå…·é«”åœ¨å°ç¨‹åºåŽè‡ºè¨(shè)置里é…置。
ç²å–é åƒåœ°å€ï¼Œé¦–å…ˆé‡å–é åƒåœ¨ç•«å¸ƒä¸çš„大å°ï¼Œå’Œx軸Yè»¸çš„åæ¨™ï¼Œé€™é‡Œçš„result[0]是我用promiseå°è£è¿”回的一個圖片地å€
let headImg = new Promise(function (resolve) {
wx.getImageInfo({
src: `${app.globalData.baseUrl2}${that.data.currentChildren.headImg}`,
success: function (res) {
resolve(res.path)
},
fail: function (err) {
console.log(err)
wx.showToast({
title: 'ç¶²(wÇŽng)絡(luò)錯誤請é‡è©¦',
icon: 'loading'
})
}
})
})
let avatarurl_width = 60, //繪制的é åƒå¯¬åº¦
avatarurl_heigth = 60, //繪制的é åƒé«˜åº¦
avatarurl_x = 28, //繪制的é åƒåœ¨ç•«å¸ƒä¸Šçš„ä½ç½®
avatarurl_y = 36; //繪制的é åƒåœ¨ç•«å¸ƒä¸Šçš„ä½ç½®
ctx.save(); // å…ˆä¿å˜ç‹€æ…‹(tà i) 已便于畫完圓å†ç”¨
ctx.beginPath(); //開始繪制
//先畫個圓 å‰å…©å€‹åƒæ•¸(shù)確定了圓心 (x,y) 忍™ ç¬¬ä¸‰å€‹åƒæ•¸(shù)是圓的åŠå¾‘ å››åƒæ•¸(shù)æ˜¯ç¹ªåœ–æ–¹å‘ é»˜èªæ˜¯false,å³é †æ™‚é‡
ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false);
ctx.clip(); //畫了圓 å†å‰ªåˆ‡ 原始畫布ä¸å‰ªåˆ‡ä»»æ„形狀和尺寸。一旦剪切了æŸå€‹å€(qÅ«)域,則所有之åŽçš„繪圖都會被é™åˆ¶åœ¨è¢«å‰ªåˆ‡çš„å€(qÅ«)域內(nèi)
ctx.drawImage(result[0], avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth); // 推進去圖片
這里舉個例å說下如何繪制文å—,比如我è¦ç¹ªåˆ¶å¦‚下這個“å—â€ï¼Œéœ€è¦å‹•æ…‹(tà i)ç²å–å‰é¢å—數(shù)的總寬度,這樣æ‰èƒ½è¨(shè)置“å—â€çš„xè»¸åæ¨™ï¼Œé€™é‡Œæˆ‘本來是想通éŽmeasureText來測é‡å—體的寬度,但是在iOS端第一次ç²å–的寬度值ä¸å°ï¼Œé—œ(guÄn)于這個å•題,我還在微信開發(fÄ)者社å€(qÅ«)æäº†bug,所以我想用å¦ä¸€å€‹æ–¹æ³•來實ç¾(xià n),就是先ç²å–æ£å¸¸æƒ…æ³ä¸‹ä¸€å€‹å—的寬度值,然åŽä¹˜ä»¥ç¸½å—數(shù)å°±ç²å¾—了總寬度,親試是å¯ä»¥çš„。

let allReading = 97 / 6 / app.globalData.ratio * wordNumber.toString().length + 325;
ctx.font = 'normal normal 30px sans-serif';
ctx.setFillStyle('#ffffff')
ctx.fillText('å—', allReading, 150);
④繪制公眾號二ç¶ç¢¼ï¼Œå’Œç²å–é åƒæ˜¯ä¸€æ¨£çš„ï¼Œä¹Ÿæ˜¯å…ˆé€šéŽæŽ¥å£è¿”回圖片網(wÇŽng)絡(luò)地å€ï¼Œç„¶åŽå†é€šéŽgetImageInfoç²å–公眾號二ç¶ç¢¼åœ–片信æ¯
⑤如何繪制å°ç¨‹åºç¢¼ï¼Œå…·é«”官網(wÇŽng)文檔也給出生æˆç„¡é™å°ç¨‹åºç¢¼æŽ¥å£ï¼Œé€šéŽç”Ÿæˆçš„å°ç¨‹åºå¯ä»¥æ‰“é–‹ä»»æ„一個å°ç¨‹åºé é¢ï¼Œå¹¶ä¸”二ç¶ç¢¼æ°¸ä¹…有效,具體調(dià o)用哪個å°ç¨‹åºäºŒç¶ç¢¼æŽ¥å£æœ‰ä¸åŒçš„æ‡‰(yÄ«ng)ç”¨å ´æ™¯ï¼Œå…·é«”å¯ä»¥çœ‹ä¸‹å®˜æ–¹æ–‡æª”怎么說的,也就是說å‰ç«¯é€šéŽå‚³éžåƒæ•¸(shù)調(dià o)å–åŽç«¯æŽ¥å£è¿”回的å°ç¨‹åºç¢¼ï¼Œç„¶åŽç¹ªåˆ¶åœ¨ç•«å¸ƒä¸Šï¼ˆå’Œä¸Šé¢å¯«çš„繪制é åƒå’Œå…¬çœ¾è™ŸäºŒç¶ç¢¼ä¸€æ¨£çš„)
ctx.drawImage('å°ç¨‹åºç¢¼çš„æœ¬åœ°åœ°å€', x軸, Y軸, 寬, 高)
⑥最終繪制完把canvas畫布轉(zhuÇŽn)æˆåœ–片并返回圖片地å€
wx.canvasToTempFilePath({
canvasId: 'myCanvas',
success: function (res) {
canvasToTempFilePath = res.tempFilePath // 返回的圖片地å€ä¿å˜åˆ°ä¸€å€‹å…¨å±€è®Šé‡é‡Œ
that.setData({
showShareImg: true
})
wx.showToast({
title: '繪制æˆåŠŸ',
})
},
fail: function () {
wx.showToast({
title: '繪制失敗',
})
},
complete: function () {
wx.hideLoading()
wx.hideToast()
}
})
⑦ä¿å˜åˆ°ç³»çµ±(tÇ’ng)相冊;先判斷用戶是å¦é–‹å•Ÿç”¨æˆ¶æŽˆæ¬Š(quán)相冊,處ç†ä¸åŒæƒ…æ³ä¸‹çš„çµ(jié)果。比如用戶如果按照æ£å¸¸é‚輯授權(quán)是沒å•é¡Œçš„ï¼Œä½†æ˜¯æœ‰çš„ç”¨æˆ¶å¦‚æžœé»žæ“Šäº†å–æ¶ˆæŽˆæ¬Š(quán)該如何處ç†ï¼Œå¦‚æžœä¸è™•ç†æœƒå‡ºç¾(xià n)一定的å•é¡Œã€‚æ‰€ä»¥ç•¶ç”¨æˆ¶é»žæ“Šå–æ¶ˆæŽˆæ¬Š(quán)之åŽï¼Œä¾†å€‹å½ˆæ¡†æç¤ºï¼Œç•¶å®ƒå†æ¬¡é»žæ“Šçš„æ™‚候,主動跳到è¨(shè)置引導(dÇŽo)用戶去開啟授權(quán),從而é”到ä¿å˜åˆ°ç›¸å†Šåˆ†äº«æœ‹å‹åœˆçš„目的。
// ç²å–用戶是å¦é–‹å•Ÿç”¨æˆ¶æŽˆæ¬Š(quán)相冊
if (!openStatus) {
wx.openSetting({
success: (result) => {
if (result) {
if (result.authSetting["scope.writePhotosAlbum"] === true) {
openStatus = true;
wx.saveImageToPhotosAlbum({
filePath: canvasToTempFilePath,
success() {
that.setData({
showShareImg: false
})
wx.showToast({
title: '圖片ä¿å˜æˆåŠŸï¼Œå¿«åŽ»åˆ†äº«åˆ°æœ‹å‹åœˆå§~',
icon: 'none',
duration: 2000
})
},
fail() {
wx.showToast({
title: 'ä¿å˜å¤±æ•—',
icon: 'none'
})
}
})
}
}
},
fail: () => { },
complete: () => { }
});
} else {
wx.getSetting({
success(res) {
// 如果沒有則ç²å–授權(quán)
if (!res.authSetting['scope.writePhotosAlbum']) {
wx.authorize({
scope: 'scope.writePhotosAlbum',
success() {
openStatus = true
wx.saveImageToPhotosAlbum({
filePath: canvasToTempFilePath,
success() {
that.setData({
showShareImg: false
})
wx.showToast({
title: '圖片ä¿å˜æˆåŠŸï¼Œå¿«åŽ»åˆ†äº«åˆ°æœ‹å‹åœˆå§~',
icon: 'none',
duration: 2000
})
},
fail() {
wx.showToast({
title: 'ä¿å˜å¤±æ•—',
icon: 'none'
})
}
})
},
fail() {
// å¦‚æžœç”¨æˆ¶æ‹’çµ•éŽæˆ–沒有授權(quán)ï¼Œå‰‡å†æ¬¡æ‰“開授權(quán)窗å£
openStatus = false
console.log('è«‹è¨(shè)ç½®å…許訪å•相冊')
wx.showToast({
title: 'è«‹è¨(shè)ç½®å…許訪å•相冊',
icon: 'none'
})
}
})
} else {
// 有則直接ä¿å˜
openStatus = true
wx.saveImageToPhotosAlbum({
filePath: canvasToTempFilePath,
success() {
that.setData({
showShareImg: false
})
wx.showToast({
title: '圖片ä¿å˜æˆåŠŸï¼Œå¿«åŽ»åˆ†äº«åˆ°æœ‹å‹åœˆå§~',
icon: 'none',
duration: 2000
})
},
fail() {
wx.showToast({
title: 'ä¿å˜å¤±æ•—',
icon: 'none'
})
}
})
}
},
fail(err) {
console.log(err)
}
})
}
總çµ(jié)
è‡³æ¤æ‰€æœ‰çš„æ¥é©Ÿéƒ½å·²å¯¦ç¾(xià n),在繪制的時候會é‡åˆ°ä¸€äº›ç•°æ¥è«‹æ±‚åŽè‡ºè¿”回的數(shù)據(jù),所以我用promiseå’Œasyncå’Œawait進行了å°è£ï¼Œç¢ºä¿å°Ž(dÇŽo)å‡ºçš„åœ–ç‰‡ä¿¡æ¯æ˜¯å®Œæ•´çš„。在繪制的éŽç¨‹ç¢ºå¯¦é‡åˆ°ä¸€äº›å‘的地方。比如åˆé–‹å§‹å°Ž(dÇŽo)出的圖片比例大å°ä¸å°ï¼Œé‚„有用measureTextæ¸¬é‡æ–‡å—寬度ä¸å°ï¼Œå¤šæ¬¡ç¹ªåˆ¶ï¼ˆå¯èƒ½å—ç¶²(wÇŽng)絡(luò)åŽŸå› ï¼‰æœ‰æ™‚å°Ž(dÇŽo)出的圖片上的文å—é¡è‰²æœƒæœ‰èª¤å·®ç‰ã€‚å¦‚æžœä½ ä¹Ÿé‡åˆ°ä¸€äº›æ¯”較å‘的地方å¯ä»¥ä¸€èµ·æŽ¢è¨Žä¸‹åšå€‹è¨˜éŒ„
相關(guÄn)案例查看更多
相關(guÄn)閱讀
- 云å—å°ç¨‹åºå…¬å¸
- 云å—çœå»ºè¨(shè)廳網(wÇŽng)ç«™
- 云å—ç¶²(wÇŽng)絡(luò)營銷顧å•
- å°ç¨‹åºå•†åŸŽ
- 汽車拆解管ç†è»Ÿä»¶
- 云å—ç¶²(wÇŽng)絡(luò)å…¬å¸
- 云å—çœåŸŽé„‰(xiÄng)建è¨(shè)廳網(wÇŽng)ç«™
- å°ç¨‹åºç”Ÿæˆæµ·å ±
- å€(qÅ«)塊éˆ
- 英文網(wÇŽng)站建è¨(shè)å…¬å¸
- 云å—ç¶²(wÇŽng)站建è¨(shè)é¸
- 云å—ç¶²(wÇŽng)站建è¨(shè)特性
- 云å—軟件è¨(shè)計
- 云å—å°ç¨‹åºé–‹ç™¼(fÄ)首é¸å“牌
- ç¶²(wÇŽng)站建è¨(shè)百度官方
- å°ç¨‹åºåˆ†éŠ·å•†åŸŽ
- ç¶²(wÇŽng)站建è¨(shè)制作
- ç¶²(wÇŽng)絡(luò)公叿ޒå
- 定制å°ç¨‹åºé–‹ç™¼(fÄ)
- å°ç¨‹åºå…¬å¸
- 云å—çœå»ºè¨(shè)廳網(wÇŽng)站官網(wÇŽng)
- 云å—ç¶²(wÇŽng)站建è¨(shè)æœå‹™(wù)å…¬å¸
- 開發(fÄ)制作å°ç¨‹åº
- 網(wǎng)絡(luò)營銷
- å‰ç«¯
- ä¿å±±å°ç¨‹åºé–‹ç™¼(fÄ)
- ç¶²(wÇŽng)站優(yÅu)化
- éœ¸å±æŽ¨å»£
- 網(wǎng)站制作
- 云å—軟件公å¸