微信小程序使用canvas绘制海报并保存本地相册

这篇具有很好参考价值的文章主要介绍了微信小程序使用canvas绘制海报并保存本地相册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在做微信小程序的时候,很多都会用到生成海报分享功能,刚好最近项目有这个需求,今天就发出来记录下

首先是使用canvas绘制一张海报,微信小程序的canvas有老版本和新版本我是用的是新版本

代码如下

<canvas class="canvas" type="2d" id="myCanvas"></canvas>

js部分

我的做法是给canvas隐藏了不看到 ,等canvas绘制完毕后导出的url直接赋给image的url,然后弹出层展示,只展示生成的海报和保存图片按钮

 qrcode(e) {
        let _this = this
        let type = e.currentTarget.dataset.type
        if (_this.data.canvasurl !== '' && type === 'open') {
            _this.setData({
                show: true
            })
            return
        }
        if (type === 'open') {
            wx.showLoading({
                title: '分享海报生成中',
            })
            const query = wx.createSelectorQuery()
            query.select('#myCanvas')
                .fields({
                    node: true,
                    size: true
                })
                .exec((res) => {
                    const canvas = res[0].node
                    const ctx = canvas.getContext('2d')
                    // 获取设备像素比
                    const dpr = wx.getSystemInfoSync().pixelRatio;
                    canvas.width = res[0].width * dpr
                    canvas.height = res[0].height * dpr
                    ctx.scale(dpr, dpr)
                    // 商品图片
                    const bg = canvas.createImage();
                    bg.src = _this.data.goodList.imgurl
                    bg.onload = () => {
                        ctx.drawImage(bg, 0, 0, 251, 225)
                    }
                    // 分割线
                    ctx.strokeStyle = 'rgba(255,255,255,0.1)';
                    ctx.beginPath();
                    ctx.moveTo(0, 225);
                    ctx.lineTo(251, 225);
                    ctx.stroke();
                    // 下半部分矩形
                    ctx.fillStyle = '#fff';
                    ctx.fillRect(0, 0, 251, 406);
                    ctx.fill()
                    // 商品名称
                    ctx.fillStyle = '#000';
                    ctx.font = "16px Arial";
                    ctx.fillText(_this.data.goodList.goods_name, 12.5, 250);
                    ctx.fill()
                    // 商品规格
                    let width = _this.data.goodList.goods_attr.length * 10
                    _this.strokeRoundRect(ctx, 12.5, 260, width, 20, 10, 'rgba(255, 111, 96,0.2)')
                    ctx.font = "12px Arial";
                    ctx.fillStyle = "#FF6F60";
                    ctx.fillText(_this.data.goodList.goods_attr, 20, 274);
                    // 商品价格
                    ctx.font = "20px Arial";
                    ctx.fillText('¥' + _this.data.goodList.goods_price, 150, 280);
                    // 最下方文字
                    ctx.font = "12px Arial";
                    ctx.fillStyle = "#949494";
                    ctx.fillText('长按识别·去看看', 77, 380);
                    // 绘制二维码
                    App._post_form('qr', {
                        id: _this.data.goodList.goods_id
                    }, result => {
                        const code = canvas.createImage();
                        code.src = result.data
                        code.onload = () => {
                            ctx.drawImage(code, 80, 285, 80, 80)
                        }
                        setTimeout(() => {
                            _this.setData({
                                // 导出canvas的url(base64格式)
                                canvasurl: canvas.toDataURL('image/png'),
                                show: true
                            })
                            wx.hideLoading()
                        }, 1000)
                    })
                })
        } else {
            _this.setData({
                show: false
            })
        }

    },

canvas绘制完毕,导出url后开始实现保存本地功能

如果是后端返的海报图片的话直接使用wx.downloadFile方法先下载到本地然后使用

wx.saveImageToPhotosAlbum再保存到相册

微信小程序使用canvas绘制海报并保存本地相册

 我是用的是canvas绘制后生成的base64所以先将base64转成图片保存在本地再使用wx.saveImageToPhotosAlbum保存到相册

// 保存图片到本地
    download() {
        const _this = this;
        // 生成临时路径
        var filepath = wx.env.USER_DATA_PATH + '/test.png';
        //获取文件管理器对象
        var aa = wx.getFileSystemManager();
        aa.writeFile({
            filePath: filepath,
            //只保留base64编码 截掉data:image/png;base64,
            data: _this.data.canvasurl.slice(22),
            encoding: 'base64',
            success: function (res) {
                wx.showLoading({
                    title: '保存中...'
                })
                wx.saveImageToPhotosAlbum({
                    filePath: filepath,
                    success: function (data) {
                        console.log('保存成功', data)
                        wx.hideLoading()
                        _this.setData({
                            show: false
                        })
                        wx.showToast({
                            title: '保存成功',
                            icon: 'success',
                            duration: 2000
                        })
                        // 删除下载暂存在本地的图片
                        let fileMgr = wx.getFileSystemManager()
                        fileMgr.unlink({
                            filePath: res.filePath,
                            success: () => {
                                console.log('删除缓存成功!')
                            }
                        })
                    },
                    fail: function (err) {
                        //   判断用户是否授权相册写入权限
                        if (err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail:auth denied") {
                            //当初用户拒绝,再次发起授权
                            wx.showModal({
                                title: '提示',
                                content: '需要您授权保存相册',
                                showCancel: false,
                                success: () => {
                                    wx.openSetting({
                                        success(settingdata) {
                                            if (settingdata.authSetting['scope.writePhotosAlbum']) {
                                                wx.showModal({
                                                    title: '提示',
                                                    content: '获取权限成功,再次点击按钮即可保存',
                                                    showCancel: false,
                                                })
                                            } else {
                                                wx.showModal({
                                                    title: '提示',
                                                    content: '获取权限失败,将无法保存到相册',
                                                    showCancel: false,
                                                })
                                            }
                                        },
                                        fail(failData) {
                                            console.log("failData", failData)
                                        },
                                        complete(finishData) {
                                            console.log("finishData", finishData)
                                        }
                                    })
                                }
                            })
                        }
                    },
                    complete(result) {
                        //console.log(result);
                        //wx.hideLoading()
                    }
                })

            }
        })



    },

所有代码对应的注释都在里面,所有的API官方文档都有,只是做的时候需要一个一个查

附上效果图

 微信小程序使用canvas绘制海报并保存本地相册

 文章来源地址https://www.toymoban.com/news/detail-404696.html

发帖只是记录,谢谢观看

 

到了这里,关于微信小程序使用canvas绘制海报并保存本地相册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

    做个简单的生成二维码海报分享, 我做的时候也找简单的方法看能不能实现页面直接截图那种生成图片,原生小程序不支持, 不多介绍下面有全部代码有注释、参数自行替换运行看看,还有需要优化的地方,有问题可以咨询我,我写的已经上线 如图:

    2024年02月11日
    浏览(32)
  • uniapp 使用canvas画海报(微信小程序)

    效果展示:  项目要求:点击分享绘制海报,并实现分享到好友,朋友圈,并保存 先实现绘制海报   下面是海报下面的分享弹窗 因为分享到朋友圈实在没找到有使用自定义按钮的可能,所以还是需要点击右上角胶囊    以上就是画海报以及分享的全部过程了,另有一个点:

    2024年02月13日
    浏览(39)
  • 微信小程序使用canvas生成分享海报功能复盘

    近期需要开发一个微信小程序生成海报分享的功能。在h5一般都会直接采用 html2canvas 或者 dom2image 之类的库直接处理。但是由于小程序不具备传统意义的dom元素,所以也没有办法采用此类工具。 所以就只能一笔一笔的用 canvas 画出来了,下面对实现这个功能中遇到的问题做一

    2024年02月16日
    浏览(42)
  • uniapp小程序使用canvas绘制内容并保存到本地相册

    需求: 根据不同用户自动生成对应证书,并且可以下载该证书(下载后得到的是一张图片),故要想实现该功能,则需要借助canvas将动态生成的内容绘制到页面中,然后再实现下载功能。 1.html代码 页面很简单,只包含一个canvas和下载按钮即可。 2.js代码 3.效果图展示 注:下

    2024年02月09日
    浏览(28)
  • 微信小程序canvas画布绘制base64图片并保存图片到相册中

    WXML部分: 样式可以根据自己需求自行调整 canvas绘制成图片部分: 这就将图片绘制出来了。 首先获取用户相册权限。 保存功能:

    2024年02月13日
    浏览(26)
  • 微信小程序使用canvas画布生成二维码海报分享图片(完整示例代码)

    canvas.js //获取应用实例 const app = getApp() Page({ /** 页面的初始数据 */ data: { // canvas _width: 0, //手机屏宽 _heigth: 0,//手机屏高 swiperHeight: 300,//主图图片高度 canvasType: false,//canvas是否显示 loadImagePath: ‘’,//下载的图片 imageUrl: ‘https://cos.myfaka.com/car/service/1.jpg’, //主图网络路径 codeU

    2024年04月12日
    浏览(55)
  • 小程序使用canvas标签生成海报并保存图片

    先说一下做功能前的感受,简直一脸懵逼,第一次用canvas,只知道是个画布,其余什么都不知道…琢磨了一天才画出来… 开始之前百度了很久,想看看别人怎么写的,但是目前网上基本上用的都是wx.createCanvasContext这个api,但是这个api已经停止维护了,要求使用canvas代替,  

    2024年02月11日
    浏览(49)
  • 微信小程序使用canvas绘制网络图片,使用canvas将图片变成圆形

    以上的写法 会造成某些图标无法绘制上去, 解决方法是在网络图片中不断嵌套,先绘制大图片,再绘制小图片的顺序 网上说使用先下载到本地,再使用img.src加载,我尝试过还是不行 长用在海报,需要将用户的头像画到canvas图片上,如: 其原理就是在图片上面放一个圆

    2024年02月13日
    浏览(44)
  • 基于 Taro 框架的微信小程序 canvas 绘图海报组件

    项目需要保存收款码,效果如图: (此文仅代表个人日常工作记录,能力有限描述并不全面) 1.安装 npm i taro-plugin-canvas -S --production(taro-plugin-canvas 是基于 Taro 框架的微信小程序 canvas 绘图组件,封装了常用的操作,通过配置的方式生成分享图片)  2.引入:import { TaroCanvas

    2024年01月21日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包