最近做小程序有个需求是将文字信息生成图片保存到本地,在PC端模拟器,图片的地址是
可以正常保存,不报错
但是到了真机的时候就报错,并且图片地址也发生改变
解决办法:
先将图片上传到服务器util.uploadFileUrl,然后再调用wx.downloadFile方法

 <button class="printInfo-btn" bindtap="handleSave">保存</button><canvas style='width:{{canvasWidth}}px;height:{{canvasHeight}}px' canvas-id='myCanvas'></canvas>
const util = require('../../utils/util.js')
const ctx = wx.createCanvasContext('myCanvas')
var leftMargin = "" //文字距离左边边距
var topMargin = "" //文字距离右边边距
Page({data:{showPrintInfo: false, //打印信息弹框是否显示title: '订单信息',serveContent: '', //修复项目salary: '', //订单信息--地址rtype: '', //订单信息--姓名rmoney: '', //订单信息--手机号orderTime: '', //订单信息--下单时间cleanTime: '', //订单信息--清洗完成时间canvasWidth: '', // canvas宽度canvasHeight: '', // canvas高度hotline: '服务热线:17333937526', //服务热线
}
// 点击打印按钮,弹出弹出层handlePrintShow() {this.setData({showPrintInfo: true})this.addImage()},// 点击保存按钮,保存到本地相册handleSave() {let _this = this;//获取相册授权wx.getSetting({success(res) {if (!res.authSetting['scope.writePhotosAlbum']) {wx.authorize({scope: 'scope.writePhotosAlbum',success() {_this.tempFilePath()}})} else {_this.tempFilePath()}}})},img(imgSrc) {let _this = thisvar imgSrc = imgSrcutil.uploadFileUrl(imgSrc, function (r) {wx.downloadFile({url:r,success(res) {wx.saveImageToPhotosAlbum({filePath: res.tempFilePath,success() {wx.showToast({title: '保存成功',duration: 2000})_this.setData({showPrintInfo: false})},fail(err) {console.log(err);if (err.errMsg === "saveImageToPhotosAlbum:fail auth deny") {wx.openSetting({success(settingdata) {console.log(settingdata)if (settingdata.authSetting['scope.writePhotosAlbum']) {wx.showToast({title: '图片已保存',icon: 'none',duration: 2000})console.log('获取权限成功,给出再次点击图片保存到相册的提示。')} else {console.log('获取权限失败,给出不给权限就无法正常使用的提示')}}})}}})},fail(err) {console.log(err);}})})},
//画背景图addImage() {var context = wx.createContext();var path = "../../components/images/share.png";//将模板图片绘制到canvas,在开发工具中drawImage()函数有问题,不显示图片//不知道是什么原因,手机环境能正常显示ctx.drawImage(path, 0, 0, this.data.canvasWidth, this.data.canvasHeight)this.addTitle()this.addRtype()this.addRmoney()this.addorderTime()this.addcleanTime()this.addSalary()this.addserveContent()this.addhotline()ctx.draw()},//画标题addTitle() {var str = this.data.titlectx.font = 'normal normal 16px sans-serif';ctx.setTextAlign('center'); // 文字居中ctx.setFillStyle("#222222");ctx.fillText(str, this.data.canvasWidth / 2, 30)},// 画姓名addRtype() {var str = this.data.rtypectx.setFontSize(14)ctx.setFillStyle("#222");ctx.setTextAlign('left');ctx.fillText(str, this.data.canvasWidth / 8, topMargin * 0.20)},// 画电话addRmoney() {var str = this.data.rmoneyctx.setFontSize(14)ctx.setFillStyle("#222");ctx.setTextAlign('left')ctx.fillText(str, this.data.canvasWidth / 8, topMargin * 0.30)},// 画地址addSalary() {var str = this.data.salarythis.handleLineBreak(ctx, str, 0.40, 14)},//画下单时间addorderTime() {var str = this.data.orderTimectx.setFontSize(14)ctx.setFillStyle("#222");ctx.setTextAlign('left');ctx.fillText(str, this.data.canvasWidth / 8, topMargin * 0.55)},//画清洗完成时间addcleanTime() {var str = this.data.cleanTimectx.setFontSize(14)ctx.setFillStyle("#222");ctx.setTextAlign('left');ctx.fillText(str, this.data.canvasWidth / 8, topMargin * 0.65)},// 画修复项目addserveContent() {var str = this.data.serveContentthis.handleLineBreak(ctx, str, 0.75, 14)},// 画服务热线addhotline() {var str = this.data.hotlinectx.setFontSize(14)ctx.setFillStyle("#222");ctx.setTextAlign('left');ctx.fillText(str, this.data.canvasWidth / 8, topMargin * 0.90)},//导出图片tempFilePath() {let _this = this;wx.canvasToTempFilePath({canvasId: 'myCanvas',success(res) {_this.img(res.tempFilePath)}});},/*** 生命周期函数--监听页面初次渲染完成*/// canvas 换行handleLineBreak(ctx, text, num, fontSize) {var text = textctx.setFontSize(fontSize)ctx.setFillStyle("#222")ctx.setTextAlign('left')var chr = text.split("") //这个方法是将一个字符串分割成字符串数组var temp = ""var row = []for (var a = 0; a < chr.length; a++) {if (ctx.measureText(temp).width < 300) {temp += chr[a]} else {a-- //这里添加了a-- 是为了防止字符丢失,效果图中有对比row.push(temp)temp = ""}}row.push(temp);//如果数组长度大于3 则截取前3个if (row.length > 3) {var rowCut = row.slice(0, 3);var rowPart = rowCut[2];var test = "";var empty = [];for (var a = 0; a < rowPart.length; a++) {if (ctx.measureText(test).width < 300) {test += rowPart[a];} else {break;}}empty.push(test);var group = empty[0] + "..." //这里只显示3行,超出的用...表示rowCut.splice(1, 1, group);row = rowCut;}for (var b = 0; b < row.length; b++) {ctx.fillText(row[b], this.data.canvasWidth / 8, topMargin * num + b * 20, 700)}},onLoad(options) {// 模拟code码if (options.code) {this.setData({code: options.code})} else {console.log("no scene");}this.queryCleanOrder()let _this = thiswx.getSystemInfo({success(res) {_this.setData({//设置宽为屏幕宽,高为屏幕高的80%,因为文档比例为5:4canvasWidth: res.windowWidth,canvasHeight: res.windowWidth * 0.8})leftMargin = res.windowWidthtopMargin = res.windowWidth * 0.8},})}})

小程序canvas文字信息绘制图片,模拟器正常保存图片,真机无法保存图片报错downloadFile:fail downloadFile protocol must be http or https相关推荐

  1. 微信小程序 canvas type = 2d 绘制海报心得(包括怎么绘制图片和圆角图片和圆角矩形等)

    微信小程序 canvas type=2d 使用心得 为了方便这里我封装成了一个component 然后说说怎么使用最新的方法(使用方法类似于html中的canvas可以进行参考)获取--canvas ...

  2. 小程序canvas商品海报绘制

    小程序canvas海报绘制 1.html 绘制图片的元素 <view class="canvas-box"><canvas style="width: ...

  3. 微信小程序报错:“该小程序提供的服务出现故障,请稍后再试”(IOS报错,Android则正常)

    记录对接微信小程序时遇到的问题,问题表现为: 1.发送消息后出现报错:该小程序提供的服务出现故障,请稍后再试 2.只有IOS会报错,Android则是正常的 3.IOS报错的微信号,即使在电脑端登录, ...

  4. [已解决]微信小程序 canvas 文字样式错乱问题

    在微信小程序中使用canvas绘制海报的时候,发现有多种不同的样式文字时, 保存canvas内容为图片,出现各种文字样式错乱. ------------------------------------ ...

  5. java drawimage图片不完整_微信小程序canvas.drawImage完全显示图片问题的解决

    问题描述 问题产生 对于微信小程序,canvas处理过程中,dramImage默认图片引用是有残缺的 导入初始项目 打开链接(原官网例子),浏览器唤醒微信开发这工具,打开连接之前需要下载好微信开发者工 ...

  6. 微信小程序使用html2canvas,微信小程序canvas 2d 引入本地图片并生成分享图

    在小程序基础库 v2.9.0 正式开放一套全新的 Canvas 接口.该接口符合 HTML Canvas 2D 的标准,实现上采用 GPU 硬件加速,渲染性能相比于现有的 Canvas 接口有一倍左右 ...

  7. 微信小程序canvas画布转成图片并在转发里面形成图片转发

    onReady() {var that = thisvar rpx = wx.getSystemInfoSync().windowWidth / 375; //加入rpx进行手机适配const que ...

  8. 微信小程序分享到朋友圈-遇到的问题drawImage真机不显示网络图片

    网上有现成的例子,所以直接拿来用了,见链接,接下来说下自己遇到的问题       ->   因为在我的项目中,我的图片是网络图片,canvas上绘制的目前只支持本地图片,那应该怎么办呢?不可能图 ...

  9. 微信小程序 canvas 文字自动换行

    Page({drawCanvas: function(ctx) {// 地址ctx.setFontSize(14)ctx.setFillStyle('#9E7240')ctx.textAlign=&q ...

最新文章

  1. 链表问题14——在单链表种删除指定值的节点
  2. Leangoo背景更新-看板背景任你选!!!
  3. codeforces 528D. Fuzzy Search 快速傅里叶变换
  4. 【Networking】容器网络大观 SDN 资料汇总
  5. MySQL深度剖析之数据在磁盘上存储(2021)
  6. VideoLan 0.8.6b test 1
  7. centos7目录结构
  8. 例子代码:web.xml
  9. 南理工OJ-1098 - 字符串问题
  10. 浅识JAVA设计模式——观察者模式
  11. 企业管理中如何激励员工
  12. 可以检测手机帧率和温度的软件_手机帧数测试教学,含免费软件下载,使用方法,数据分析方法详解...
  13. 铃声截取软件android6,铃声剪辑
  14. 构词法——现代单词记忆十大规律
  15. 冬虫夏草之技术路线图之二【“术”——业务篇】
  16. 腾讯QQ空间穿越时光轴3D特效
  17. CKPlayer视频地址加密方法
  18. allegro如何快设置快捷键旋转器件
  19. Visual Studio 2017卸载不干净
  20. 「经济读物」小狗钱钱

热门文章

  1. sql语句,如何找出重复的数据
  2. Oracle Data purge(Oracle一键数据删除)
  3. oracle大数据量删除方案
  4. 天津春考计算机知识,2014天津春季高考计算机基础考试大纲
  5. 重启计算机关闭账户,电脑开机重启提示您的账户已被停用怎么办
  6. [离散数学]命题逻辑P_7:范式
  7. 【精选实践】随手科技在 TiDB 的探索之路
  8. 基于标准库函数与基于HAL库函数的stm32编程方式对比
  9. 程序员是怎么安排电脑桌面的
  10. Pyhton之异常处理