網站首頁 編程語言 正文
項目場景:微信小程序canvas drawImage
微信小程序項目開發海報分享
問題描述:
在開發中,使用canvas 的drawImage方法繪圖時在模擬器中正常顯示,真機調試時反而不顯示
drawCanvas() {
let that = this
let rpx = that.data.windowW / 375
// 使用 wx.createContext 獲取繪圖上下文 context
let context = wx.createCanvasContext('firstCanvas', that)
// 海報背景
that.roundRect(context, 49 * rpx, 15 * rpx, 278 * rpx, 440 * rpx, 8)
// 頭部
that.roundRect(context, 49 * rpx, 15 * rpx, 278 * rpx, 41 * rpx, 8,"#009943")
context.drawImage('/static/newImage/logo1.png',61* rpx, 24 * rpx, 77 * rpx, 23 * rpx)
// 商品圖片
context.drawImage(that.data.thumbnail, 61 * rpx, 80 * rpx, 252 * rpx, 209 * rpx)
// 價格信息
context.setFontSize(11)
context.setFillStyle("#888888")
context.setTextAlign('center')
context.fillText(this.data.rule, 185 * rpx, 339 * rpx,252*rpx)
let goods_name=this.data.goods_name,specialOffer=this.data.specialOffer,specialOffers=""
console.log(specialOffer)
if(specialOffer&&specialOffer[0]){
if(specialOffer[0].promotion_full_vos){
specialOffer[0].promotion_full_vos.forEach(item=>{
if(!specialOffers)
specialOffers=item.mzj_rule_detail.split('|')[0]
console.log(specialOffers)
})
}
}
if(specialOffers.length>18)
specialOffers=specialOffers.substr(0,18)+'...'
if(goods_name.length>18)
goods_name=goods_name.substr(0,18)+'...'
if(specialOffers){
// 活動信息
context.setFontSize(16)
context.setFillStyle("#FA5C50")
context.setTextAlign('center')
context.fillText(specialOffers, 185 * rpx, 319 * rpx,252*rpx)
// 商品名稱
context.setFontSize(12)
context.setFillStyle("#282828")
context.setTextAlign('center')
context.fillText(goods_name, 185 * rpx, 359 * rpx,252*rpx)
}
else{
// 商品名稱
context.setFontSize(12)
context.setFillStyle("#282828")
context.setTextAlign('center')
context.fillText(this.data.goods_name, 185 * rpx, 319 * rpx,252*rpx)
}
// 虛線圖片
context.drawImage('/static/newImage/logo2.png', 50 * rpx, 375 * rpx, 270 * rpx,1 * rpx)
// 最快30分鐘送貨上門 神威大藥房
context.setFontSize(15)
context.setFillStyle("#009943")
context.setTextAlign('left')
context.fillText('最快30分鐘送貨上門', 61 * rpx, 409 * rpx,252*rpx)
context.fillText('神威大藥房', 61 * rpx, 429 * rpx,252*rpx)
// 店主二維碼
wx.getFileSystemManager().writeFile({
filePath: wx.env.USER_DATA_PATH + "/test.png",
data: that.data.minicode.replace('data:image/PNG;base64,',''),
encoding: 'base64',
success: (ress) => {
context.drawImage(wx.env.USER_DATA_PATH + "/test.png", 250 * rpx, 385 * rpx, 65 * rpx, 65 * rpx)
context.draw(true)
},
fail(error){
console.log(error,"寫入失敗")
}
})
context.measureText(that.data.assemble.sales_price).width + 35;
context.draw(true)
},
原因分析:
根據官方文檔指示,canvas drawImage方法不支持網絡圖片圖片源于微信小程序官方文檔,解決辦法如圖所示,親測可行。
網絡圖片用法代碼如下:
wx.downloadFile({
url:that.data.goods_image,
success(res){
context.drawImage(res.tempFilePath, 111 * rpx, 130 * rpx, 152 * rpx, 169 * rpx)
context.draw(true)
},
fail(error){
console.log(error)
}
})
在網上搜索官方回應不支持base64圖片,對于base64圖片需要通過小程序文件系統將其保存在本地然后根據路徑獲取圖片繪制到海報相應的位置。
base64圖片代碼用法如下:
wx.getFileSystemManager().writeFile({
filePath: wx.env.USER_DATA_PATH + "/test.png",
data: that.data.miniCode,
encoding: 'base64',
success: (ress) => {
context.drawImage(wx.env.USER_DATA_PATH + "/test.png", 250 * rpx, 385 * rpx, 65 * rpx, 65 * rpx)
context.draw(true)
},
fail(error){
console.log(error,"寫入失敗")
}
})
警告:base64圖片在使用 wx.getFileSystemManager().writeFile 方法時,需要去掉base64頭部***“data:image/PNG;base64,”***,該方法會默認加這個頭的,否則圖片寫入成功,但是不顯示在cavans上
解決方案:
網絡圖片以及base64圖片親測可行,放心使用。
原文鏈接:https://blog.csdn.net/qq_32202709/article/details/114444207
相關推薦
- 2023-01-09 Kotlin協程的線程調度示例詳解_Android
- 2022-04-23 C語言Static?關鍵字解析_C 語言
- 2022-05-31 如何用python合并多個有規則命名的nc文件_python
- 2022-12-06 靜態pod?創建使用示例詳解_docker
- 2023-10-09 對Uni-app進行原生開發
- 2022-10-03 Go?Excelize?API源碼閱讀Close及NewSheet方法示例解析_Golang
- 2022-12-12 python?打印完整異常問題_python
- 2023-07-04 Spring中@Transactional注解事務傳播行為propagation參數說明
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支