小程序离屏canvas(createOffscreenCanvas)生成推广海报

这篇具有很好参考价值的文章主要介绍了小程序离屏canvas(createOffscreenCanvas)生成推广海报。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小程序离屏canvas(createOffscreenCanvas)生成推广海报

离屏canvas调用wx.canvasToTempFilePath报错Failed to execute ‘drawImage’ on ‘CanvasRenderingContext2D’: The provided value is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)
开发者工具版本:稳定版1.05.2204180(windows)
调试基础库版本:2.24.0

网上查半天资料一直找不到原因,不知道是不是createOffscreenCanvas不支持wx.canvasToTempFilePath方法,官方文档也没有说明。所以现在是用base64方法来生成海报。
各位如果知道是什么原因,麻烦告知一下哈!

--------------------------------------------------------------- 分割线 ---------------------------------------------------------------

背景图片

小程序离屏canvas(createOffscreenCanvas)生成推广海报

效果图

小程序离屏canvas(createOffscreenCanvas)生成推广海报文章来源地址https://www.toymoban.com/news/detail-499763.html

getPoster: async function (e) {
    let that = this
    //  文件管理
    let fs = wx.getFileSystemManager();
    try {
      //  判断文件是否存在,如果存在则直接显示图片
      fs.accessSync(`${wx.env.USER_DATA_PATH}/images/sharePoster.jpg`);
      this.setData({
        src: `${wx.env.USER_DATA_PATH}/images/sharePoster.jpg`
      })
      //  获取(缓存)背景图片的md5
      let sharePoster_md5 = wx.getStorageSync('sharePoster_md5');
      //  如果缓存不存在则重新生成海报
      if (!sharePoster_md5) {
        wx.showModal({
          title: "提示",
          content: "海报已更新,请重新生成!",
          showCancel: false,
          complete(res){
          //  删除缓存的图片
            fs.unlink({
              filePath: `${wx.env.USER_DATA_PATH}/images/sharePoster.jpg`,
              success(res) {
                console.log(res)
                //  重新调用该函数
                that.getPoster()
              },
              fail(res) {
                console.error(res)
              }
            })
          }
        })
      }else{
      //  背景图片的md5存在,请求后端对比服务器的背景图片的md5是否一致,如果不一致,则需要重新生成海报
        let md5 = await App.req.request('https://XXX.com/getSharePoster_md5.php', {md5: sharePoster_md5})
        if (md5.data !== 1) {
          wx.showModal({
            title: "提示",
            content: "海报已更新,请重新生成!",
            showCancel: false,
            complete(res){
              fs.unlink({
                filePath: `${wx.env.USER_DATA_PATH}/images/sharePoster.jpg`,
                success(res) {
                  console.log(res)
                  that.getPoster()
                },
                fail(res) {
                  console.error(res)
                }
              })
            }
          })
        }
      }
    } catch (e) {
    //	生成分享海报
      wx.showLoading({
        title: '正在生成分享码',
        mask: true
      })
      try {
        //  判断目录是否存在
        fs.accessSync(`${wx.env.USER_DATA_PATH}/images/`);
        console.log('目录存在');
      } catch (e) {
      //	目录不存在,创建目录
        try {
          fs.mkdirSync(`${wx.env.USER_DATA_PATH}/images/`, false)
          console.log("创建目录成功");
        } catch (error) {
          console.log("创建目录失败", error);
          wx.hideLoading();
          wx.showModal({
            title: "提示",
            content: "生成失败,请重试!",
            showCancel: false
          })
          throw false;
        }
      }
      //  请求后端生成小程序码(带参数)
      let img = await App.req.request('https:/XXX.com/getQRCode.php', {
        userId: App.data.userInfo.userId
      });
      img = img.data
      console.log("小程序码", img);
      // 获取背景图片信息(该接口会将图片加载到本地,但不会保存)
      let imageInfo = await App.wxp.getImageInfo({
        src: "https://XXX.com/sharePoster.jpg"
      });
      console.log("图片信息", imageInfo);
      //  判断生成小程序码和获取海报图片信息是否成功
      if (img.status === 1 && imageInfo.path) {
        //  创建离屏canvas
        let canvas = wx.createOffscreenCanvas({
          type: '2d',
          width: imageInfo.width,	//	canvas的宽度为"背景图片"的宽度
          height: imageInfo.height	//	canvas的高度为"背景图片"的高度
        });
        //  获取canvas上下文
        let context = canvas.getContext('2d')
        // 创建小程序码图片
        let QRCode = canvas.createImage();
        //  赋值图片地址
        QRCode.src = img.base64
        // 创建海报背景图片
        let sharePoster = canvas.createImage()
        sharePoster.src = imageInfo.path
        sharePoster.onload = e => {
          context.clearRect(0, 0, canvas.width, canvas.height);
          //  将背景图片绘制到canvas画布
          context.drawImage(sharePoster, 0, 0, imageInfo.width, imageInfo.height, 0, 0, imageInfo.width, imageInfo.height);
          //  将小程序码绘制到canvas画布(先绘制背景图片再绘制小程序码,所以小程序码会在背景图片上面)
		  // coordinateX,coordinateY是将小程序码绘制在背景图片的X坐标和Y坐标,坐标我是从后端传过来的,你们根据自己的背景图片来定这个坐标
          context.drawImage(QRCode, 0, 0, img.width, img.height, img.coordinateX, img.coordinateY, img.width, img.height)
          //  将canvas画布内容转base64
          let base64 = context.canvas.toDataURL('image/png');
          //  删除base64字符串的空格
          base64 = base64.replace('data:image/png;base64,', '');
          //  删除base64字符串的回车符和换行符
          base64 = base64.replace(/[\r\n]/g, '');
          try {
            //  将base64数据写入jpg文件(writeFile第一个参数是保存文件的路径,第二个参数是需要写入的数据,第三个参数是指定写入文件的编码,这里一定要用base64,这里一定要用base64,这里一定要用base64)
            fs.writeFileSync(`${wx.env.USER_DATA_PATH}/images/sharePoster.jpg`, base64, 'base64');
            //  没有报错,写入文件成功
            that.setData({
              src: `${wx.env.USER_DATA_PATH}/images/sharePoster.jpg`
            })
            
            //  获取背景图片的MD5值并存入缓存(用于判断当前海报的背景图片跟服务器的背景图片是否一致,如果则重新生成海报)
            fs.getFileInfo({
              filePath: imageInfo.path,
              complete(res){
                console.log("成功",res);
                if(res.digest){
                  wx.setStorage({
                    key: "sharePoster_md5",
                    data: res.digest
                  })
                }
              }
            })

          } catch (err) {
            console.log("生成失败",err);
            //  写入文件失败
            wx.showModal({
              title: "提示",
              content: "生成失败,请重试!",
              showCancel: false
            })
          }
          wx.hideLoading();
        }
      } else {
        //  生成小程序失败或获取图片信息失败
        wx.hideLoading();
        wx.showModal({
          title: "提示",
          content: "生成失败,请重试!",
          showCancel: false
        })
      }
    }
  },

到了这里,关于小程序离屏canvas(createOffscreenCanvas)生成推广海报的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 微信小程序使用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日
    浏览(92)
  • 微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

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

    2024年02月11日
    浏览(54)
  • 微信小程序——二维码推广海报

    😊博主:小猫娃来啦 😊本文核心: 本地图片和接口返回二维码制作一体化canvas海报 在微信小程序中,我们使用 canvas 标签来创建一个画布 wxml 文件: 确立基本样式 wxss文件: 我们先使用 wx.createCanvasContext 创建一个 canvas 的上下文对象,然后通过调用 drawImage 方法分别绘制背

    2024年02月16日
    浏览(60)
  • 【小程序】Canvas 画布分享海报

    成品效果图 可以通过切换下面图片形成不同的海报背景分享图

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

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

    2024年02月13日
    浏览(61)
  • 【uni-app】后端返回base64转二维码并显示在canvas生成海报

    使用官方的 uni.getFileSystemManager().writeFile() 方法可将base64码转成的二维码显示在画布上,代码如下: const obj = {                     page: \\\'pages/sort/goodsDetail\\\',                     co_Nu: this.goodInfo.co_Nu                 }                 const _this = this       

    2024年02月11日
    浏览(58)
  • 微信小程序使用canvas绘制海报并保存本地相册

    在做微信小程序的时候,很多都会用到生成海报分享功能,刚好最近项目有这个需求,今天就发出来记录下 首先是使用canvas绘制一张海报,微信小程序的canvas有老版本和新版本我是用的是新版本 代码如下 js部分 我的做法是给canvas隐藏了不看到 ,等canvas绘制完毕后导出的url直接赋给

    2023年04月08日
    浏览(40)
  • 基于 Taro 框架的微信小程序 canvas 绘图海报组件

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

    2024年01月21日
    浏览(47)
  • 在H5、微信小程序中使用canvas绘制二维码、分享海报

    提示:绘制二维码的插件有很多,有些仅支持H5,有些只适用微信小程序,故读者在使用二维码插件前需要先查看插件官方文档,查看其支持的环境 H5中安装qrious插件 引入qrious canvas模板 初始化canvas 二维码绘制并渲染 微信小程序中安装weapp-qrcode插件 引入weapp-qrcode canvas模板

    2024年02月14日
    浏览(55)
  • 微信小程序海报插件Painter 2.0(canvas画图)使用并保存图片到相册案例

    Painter通过 json 数据形式,来进行动态渲染并绘制出图片。 Painter 的优势 功能全,支持文本、图片、矩形、qrcode 类型的 view 绘制 布局全,支持多种布局方式,如 align(对齐方式)、rotate(旋转) 支持圆角,其中图片,矩形,和整个画布支持 borderRadius 来设置圆角 支持边框,

    2024年01月20日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包