微信小程序canvas画布绘制base64图片并保存图片到相册中

news/2024/7/20 2:41:08 标签: 微信小程序, 小程序
WXML部分:
    <view class="img_"  style="width: 100%;">
      <canvas type="2d" id="canvasId" style="width: 100%;height: 100%" ></canvas>      
      <button style="margin: auto;width: 70%;margin-top: 10px;" bindtap="saves">保存图片</button>
    </view>

样式可以根据自己需求自行调整 

canvas绘制成图片部分:
  //写在接口成功回调中
const fs = wx.getFileSystemManager();
          var codeimg = wx.env.USER_DATA_PATH + '/' + '.jpg';
          fs.writeFile({
            filePath: codeimg,
            data: res.data.slice(22), // code就是接口返回的base64数据(分割掉前面的data:image/png;base64,)
            encoding: 'base64',
            success: () => {
              // console.log(codeimg);
 
              wx.createSelectorQuery().select('#canvasId').fields({
                node: true,
                size: true
              })
                .exec((res) => {
                  console.log(res);
                  let ctx = res[0].node.getContext('2d'); //getContext返回Canvas 的绘图上下文              
                  let canvas = res[0].node;
                  const bg = canvas.createImage();
                    //背景图片,可以不进行设置
                  const image = canvas.createImage();
                    // 图片高清化
                  const dpr = wx.getSystemInfoSync().pixelRatio;
                  res[0].node.width = res[0].node.width * dpr;
                  res[0].node.height = res[0].node.height * dpr;
                  // 设置背景图片src
                  image.src = 'https://pic.imgdb.cn/item/647d31011ddac507cc160e75.jpg'
                  bg.src = codeimg;
                  image.onload = function () {
                    ctx.drawImage(image, 0, 0, 900, 440)
                    ctx.drawImage(bg, 240, 210, 430, 160);
                
                  }
                // 将图片保存需要的实例,不写保存可以删除
                  that.setData({
                    ctx:canvas
                   })
                })

 

这就将图片绘制出来了。

图片保存功能:

首先获取用户相册权限。
// 检查用户是否已经授权
    wx.getSetting({
      success: (res) => {
        if (!res.authSetting['scope.writePhotosAlbum']) {
          // 如果用户未授权,则向用户请求授权
          wx.authorize({
            scope: 'scope.writePhotosAlbum',
            success: () => {
              console.log('授权成功')
            },
            fail: () => {
              console.log('授权失败')
            }
          })
        } else {
          console.log('已经授权')
        }
      }
    })
保存功能:
// 保存图片
  saves() {
      let _this = this;
      wx.canvasToTempFilePath({
        // 把画布转化成临时文件
        x: 0,
        y: 0,
        width: 380, // 截取的画布的宽
        height: 600, // 截取的画布的高
        destWidth: 380, // 保存成的画布宽度
        destHeight: 600, // 保存成的画布高度
        fileType: 'jpg', // 保存成的文件类型
        quality: 1, // 图片质量
        //如果图片不是2D的话,就需要使用canvasId属性,详情请查看小程序>微信小程序官方文档
        canvas:_this.data.ctx, // 画布实例
        success(res) {         
          // 2-保存图片至相册
          wx.saveImageToPhotosAlbum({
            // 存成图片至手机
            filePath: res.tempFilePath,
            success(res2) {
              wx.hideLoading();
              wx.showToast({
                title: '保存成功',
                duration: 2000
              });
            },
            fail(res3) {
              if (res3.errMsg === 'saveImageToPhotosAlbum:fail auth deny') {
                wx.showToast({
                  title: '保存失败,稍后再试',
                  duration: 2000,
                  icon: 'none'
                });
                wx.hideLoading();
              } else {
                wx.showToast({
                  title: '保存失败,稍后再试',
                  duration: 2000,
                  icon: 'none'
                });
                wx.hideLoading();
              }
            }
          });
        },
        fail(err) {
          console.log(err);
          
          wx.showToast({
            title: '保存失败,稍后再试',
            duration: 2000,
            icon: 'none'
          });
          wx.hideLoading();
        }
      });
    }


http://www.niftyadmin.cn/n/5090686.html

相关文章

Java练习题-获取数组元素最大值

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

代码随想录二刷 Day 34

455.分发饼干 这个题差不多是两个for循环遍历&#xff0c;然后用双指针法化简&#xff0c;自己可以大概写出来&#xff0c;漏了一个边界条件 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end(…

List 模拟实现

前言 本文将会向你介绍如何模拟实现list、iterator迭代器 模拟实现 引入 迭代器是一种用于访问容器中元素的对象&#xff0c;它封装了对容器中元素的访问方式。迭代器提供了一组操作接口&#xff0c;可以让我们通过迭代器对象来遍历容器中的元素。&#xff08;iterator迭代器…

Dirac delta function (狄拉克 delta 函数)

啥意思呢&#xff1f;其不是一个具体的函数&#xff0c;而是具有某一性质的函数的总称。比如正态分布只是一个总称&#xff0c;不告诉均值和方差你根本不知道它长什么样。 满足什么性质呢&#xff1f;总结就是&#xff0c;该函数满足积分为1&#xff0c;积分区间为无穷小&…

XTU-OJ 1175-Change

题目描述 一个班有N个学生&#xff0c;每个学生有第一学期成绩Xi,第二学期成绩Yi&#xff0c;请问成绩上升&#xff0c;持平&#xff0c;下降的人数。 输入 每个样例的第一行是整数N(0≤N≤50),如果N0&#xff0c;表示输入结束&#xff0c;这个样例不需要处理。 第二行是N个整数…

【C语言】找单身狗

#include <stdio.h> #include <assert.h> int find_Single_dog_1(int* arr, int sz) {assert(arr);// 拿一个数接收单身狗int ret 0;for (int i 0; i < sz; i){// 两个数进行异或ret ^ arr[i];}return ret; } int main() {int arr[] { 1, 1, 2, 2, 3, 3, 4, …

Linux 文件系统逻辑结构图的解释

task_struct进程结构体&#xff0c;表示一个运行的进程。 task_struct中的fs指向fs_struct结构体。fs_struct表示这个进程支持的文件系统。 root指向根目录dentry&#xff0c;dentry中的d_inode指向改进程根目录在存储设备中的inode节点。 pwd指向当前进程所在的目录结构体den…

启山智软/JAVA商城

一、项目介绍 启山网上商城采用目前流行的JAVA spring cloud架构开发&#xff0c;前端使用的是目前最流行的TypeScript、VUE3、uniapp、element-plus、pinia技术&#xff0c;后端采用的是JAVA、SpringBoot、spring cloud技术&#xff0c;数据库采用的是MSQ&#xff0c;采用前后…