微信小程序海报插件Painter 2.0(canvas画图)使用并保存图片到相册案例

一、下载与引入

Painter通过 json 数据形式,来进行动态渲染并绘制出图片。

Painter 的优势

  • 功能全,支持文本、图片、矩形、qrcode 类型的 view 绘制
  • 布局全,支持多种布局方式,如 align(对齐方式)、rotate(旋转)
  • 支持圆角,其中图片,矩形,和整个画布支持 borderRadius 来设置圆角
  • 支持边框,同时支持 solid、dashed、dotted 三种类型
  • 支持渐变色,包括线性渐变与径向渐变。
  • 支持 box-shadow 和 text-shadow,统一使用 shadow 表示。
  • 支持文字背景、获取宽度、主动换行
  • 支持自定义字体
  • 支持图片 mode
  • 支持元素的相对定位方法
  • 杠杠的性能优化,我们对网络素材图片加载实现了一套 LRU 存储机制,不用重复下载素材图片。
  • 杠杠的容错,因为某些特殊情况会导致 Canvas 绘图不完整。我们对此加入了对结果图片进行检测机制,如果绘图出错会进行重绘。
  • 生成的图片支持分辨率调节
  • 支持使用拖动等操作动态编辑绘制内容

文件源码和文档地址:https://gitee.com/jackhunx/Painter

下载文件保存到components文件夹下

javascript 复制代码
//在需要使用的页面json中引入
"usingComponents": {
    "painter":"/components/painter/painter"
}

二、使用

wxml

javascript 复制代码
<!-- 海报弹框 -->
<van-popup show="{{isPosterShow}}" bind:close="closePosterFn" custom-style="background: none;">
    <view class="poster">
        <image bind:tap="saveImageFn" src="{{posterImageUrl}}" mode=""/>
        <text>点击图片,保存至手机相册</text>
    </view>
</van-popup>

<painter palette="{{posterData}}" bind:imgOK="onImageOK" />

js

javascript 复制代码
var app = getApp();
Page({

    /**
     * 页面的初始数据
     */
    data: {
        isPosterShow: false,//海报弹框
        qrCodeUrl: "",//二维码图片路径
        posterData: {},//海报数据
        posterImageUrl: "",//海报图片
    },
    //绘制海报
    drawPosterFn(){
    	wx.showLoading({
            title: '生成中',
        })
        this.setData({
             posterData: {
                 background: '背景颜色或背景图片地址',
                 width: '1164rpx',
                 height: '1548rpx',
                 views: [
                     {
                         type: "text",
                         text: "文字内容",
                         css: {
                             top: "256rpx",
                             left: "82rpx",
                             width: "1000rpx",
                             fontSize: "72rpx",
                             color: "#0159BB",
                             maxLines: 2,
                             lineHeight: "108rpx",
                             textAlign: "center",
                             fontWeight: "bold"
                         }
                     },
                     {
                         type: 'image',
                         url: "二维码图片地址",
                         css: {
                             top: '680rpx',
                             left: '264rpx',
                             width: '640rpx',
                             height: '640rpx',
                         },
                     }
                 ],
             }
         })
    },
    //监听海报是否生成成功
    onImageOK(e){
        wx.hideLoading();
        this.setData({
            isPosterShow: true,
            posterImageUrl: e.detail.path
        })
    },
    //保存图片到本地
    saveImageFn(){
        let that = this
        wx.saveImageToPhotosAlbum({
            filePath: this.data.posterImageUrl,
            success(res) {
                wx.hideLoading()
                wx.showToast({
                    title: '保存成功',
                    icon: "success",
                    duration: 1000
                })
            },
            fail(err) {
                console.log(err)
                if(err.errMsg == "saveImageToPhotosAlbum:fail auth deny"){
                    wx.showModal({
                        content: '检测到您没有授权保存到相册权限,是否去设置打开?',
                        confirmText: "确认",
                        cancelText: "取消",
                        success: function(res) {
                            //点击"确认"时打开设置页面
                            if (res.confirm) {
                                wx.openSetting({
                                    success () {
                                        that.savePhoto();
                                    }
                                })
                            } else {
                                
                            }
                        }
                    });
                }else if(err.errMsg == "saveImageToPhotosAlbum:fail privacy permission is not authorized"){
					app.showMsg("没有同意用户隐私协议!");
                }else if(err.errMsg == "saveImageToPhotosAlbum:fail privacy permission is not authorized in gap"){
                    app.showMsg("保存失败!");
                }else{
                    app.showMsg(err.errMsg);
                }
            }
        })
    },
    //下载图片地址并保存到相册,提示保存成功
    savePhoto() {
        wx.saveImageToPhotosAlbum({
            filePath: this.data.posterImageUrl,
            success(res) {
                wx.hideLoading()
                wx.showToast({
                    title: '保存成功',
                    icon: "success",
                    duration: 1000
                })
            },
            fail() {
                wx.showToast({
                    title: '保存失败',
                    icon: "error",
                    duration: 1000
                })
            }
        })
    },
    //关闭海报弹框
    closePosterFn(){
        this.setData({
            isPosterShow: false
        })
    },
    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {
        this.drawPosterFn()
    },
})
相关推荐
爱吃青椒不爱吃西红柿‍️2 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
一棵开花的树,枝芽无限靠近你5 分钟前
【PPTist】添加PPT模版
前端·学习·编辑器·html
陈王卜8 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
景天科技苑16 分钟前
【vue3+vite】新一代vue脚手架工具vite,助力前端开发更快捷更高效
前端·javascript·vue.js·vite·vue项目·脚手架工具
SameX17 分钟前
HarmonyOS Next 安全生态构建与展望
前端·harmonyos
小行星12527 分钟前
前端预览pdf文件流
前端·javascript·vue.js
小行星12533 分钟前
前端把dom页面转为pdf文件下载和弹窗预览
前端·javascript·vue.js·pdf
Lysun00143 分钟前
[less] Operation on an invalid type
前端·vue·less·sass·scss
J总裁的小芒果1 小时前
Vue3 el-table 默认选中 传入的数组
前端·javascript·elementui·typescript
Lei_zhen961 小时前
记录一次electron-builder报错ENOENT: no such file or directory, rename xxxx的问题
前端·javascript·electron