微信分享时自定义分享图片

这篇具有很好参考价值的文章主要介绍了微信分享时自定义分享图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序页面分享 自定义图片,微信小程序,canvas,微信小程序,小程序微信小程序页面分享 自定义图片,微信小程序,canvas,微信小程序,小程序

    在开发微信小程序时产品提出了一个需求,就是当用户在阅读一片文章想分享时:1.分享时的背景需要和当前页面文章展示的背景一致(文章展示时背景是随机的)。2:分享时分享的封面中的文案要和当前文章有关联,就是分享时封面的标题需要和当前用户看到的文章标题一致。3:当用户点击了分享的卡片,文章展示的背景要和分享时的封面背景一致。

需求解决方案分析:

   1 . 分享时使用文章的封面作为分享时的封面            

          当时第一想到的解决方案就是使用文章的封面作为分享时的图片,但是这样会给文章的编写带来很大压力,每一篇文章都设计一个封面 这个显然是不现实的,当文章大量上架时估计UI该骂街了,而且还面临一个问题就是 分享时的图片要求的是5:4的比例 而我们文章封面是16:9 的封面显示也不适合作为分享的封面使用,所以这张解决方案很快就被pass,就算上这样实现了后期被推翻的可能性很大。          

    2 . 使用canvas 绘制出分享时的封面

      正当一筹莫展时看到 微信的api 中的 imageUrl 参数 

onShareAppMessage(Object object)

imageUrl   自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。

那我们可不可以使用canvas 绘制出分享时的封面,再通过api 得到一个临时的图片地址imageUrl的参数呢?经过一番尝试,发现是可以的。

index.wxml   

 定义一个5:4 的 canvas,这里要注意的时由于canvas 的层级很高,而我们绘制页面时又不想让用户看到这个 canvas 这时我们可以给这个canvas 设置定位将位置设置到屏幕以外

<canvas type="2d" id="share" canvas-id="share" style="width: 750rpx;height: 600rpx;"></canvas>

 index.wxss

#share {
  position: absolute;
  top: -100000rpx;
}

index.js

    // 绘制分享的canvas
    _setShareImg() {
        let query = wx.createSelectorQuery()
        query.select('#share')
            .fields({
                node: true,
                size: true
            })
            .exec(async (res) => {
                // Canvas 对象
                const canvas = res[0].node
                // 渲染上下文
                const ctx = canvas.getContext('2d')
                // Canvas 画布的实际绘制宽高
                const width = res[0].width
                const height = res[0].height
                canvas.width = width;
                canvas.height = height;
                console.log(canvas.width, canvas.height);
                // 将背景图片绘制在canvas上
                await drawImageToCanvas.call(canvas, this.data.randomColor.bgUrl, 0, 0, width, height);
                // 绘制 健康百科 的圆角背景
                ctx.beginPath()
                ctx.fillStyle = '#2CBEAC'; // 设置填充颜色
                ctx.fillRect(getPositonX(70, width), getPositonY(50, height), getPositonX(150, width), getPositonY(50, height));
                // 封装方法 绘制 健康百科
                fillText.call(ctx, "健康百科", "#fff", getPositonX(30, width), getPositonX(68 + 18, width), getPositonY(60, height))
                // 封装方法 绘制 都是您想知道的 杏林药安出品
                fillText.call(ctx, "都是您想知道的 ~ 杏林药安出品", "#848484", getPositonX(34, width), getPositonX(70, width), getPositonY(122, height))
                // 限制标题最大的显示字数 
                let title = this.data.title;
                if (title.length > 27) {
                    title = title.substr(0, 23) + '...'
                }
                // 封装方法将文本分割成 固定数量  并返回集合数组
                const textArr = TextToArray(title, 9);
                const TextH = 206,
                    lineH = 100;
                textArr.forEach((item, index) => {
                    // 这里调用两遍是为了实现字体加粗的效果 绘制时错开了 0.5px 
                    fillText.call(ctx, item.join(""), "#333", getPositonX(70, width), getPositonX(70, width), getPositonY(TextH + lineH * index, height))
                    fillText.call(ctx, item.join(""), "#333", getPositonX(70, width), getPositonX(70 - 0.5, width), getPositonY(TextH + lineH * index - 0.5, height))
                })
                // 
                this.setData({
                    shareUrl: await canvasToTempFilePath(canvas)
                })
            })
    },

   onShareAppMessage() {
        return {
            title: '杏林药安,专注药学服务!',
            path: `/pages/plunge/index? 
            // randomIndex 当前随机颜色的索引
            entityid=${this.data.entityid}&randomIndex=${this.data.randomIndex}`,
            imageUrl: this.data.shareUrl
        }
    },

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

/**
 * @deprecated 将一段字符串分割为 固定长度为一组的数组
 * @param {String} textString 
 * @param {Number} len 
 */
function TextToArray(textString, len) {
    var textArr = textString.split("");
    return textArr.reduce((pre, next, index, arr) => {
        return pre.concat([arr.splice(0, len)])
    }, []);
}
// canvas中绘制带圆角的矩形
function drawRoundRectPath(cxt, width, height, radius) {
    cxt.beginPath(0);
    //从右下角顺时针绘制,弧度从0到1/2PI  
    cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2);
    //矩形下边线  
    cxt.lineTo(radius, height);
    //左下角圆弧,弧度从1/2PI到PI  
    cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI);
    //矩形左边线  
    cxt.lineTo(0, radius);
    //左上角圆弧,弧度从PI到3/2PI  
    cxt.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2);
    //上边线  
    cxt.lineTo(width - radius, 0);
    //右上角圆弧  
    cxt.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2);
    //右边线  
    cxt.lineTo(width, height - radius);
    cxt.closePath();
}
/**
 * 
 * @param {String} text 文字
 * @param {String} color 字体颜色
 * @param {Number} fontSize  字号
 * @param {Number} pX X坐标
 * @param {Number} pY Y坐标
 * @param {Number} maxWidth 最大宽度 
 * @param {String} textBaseline 基线
 * @param {String} fontStyle 字体
 * 运行两次fillText,x,y的值一次为 (x-0.5,y),一次为 (x,y-0.5),打出来的会变粗
 */
function fillText(text, color, fontSize, pX, pY, maxWidth = 690, textBaseline, fontStyle) {
    this.fillStyle = color;
    this.textBaseline = textBaseline ? textBaseline : "top" // 文本基线是 em 方框的顶端
    this.font = `${fontSize}px ${fontStyle?fontStyle:"PingFangSC-Semibold, PingFang SC"}`; //设置字体
    this.fillText(text, pX, pY, maxWidth ? maxWidth : 690); //填充文字
}
/**
 * 将canvas 转成临时图片地址
 * @param {String} canvas id 
 */
function canvasToTempFilePath(canvas) {
    return new Promise((resolve, reject) => {
        wx.canvasToTempFilePath({
            canvas,
            fileType: "jpg",
            quality: 1,
            success(res) {
                resolve(res.tempFilePath)
            },
            fail() {
                reject(false)
            }
        })
    })
}

/**
 * 将图片绘制在canvas
 * @param {String} url 图片路径
 * @param {Number} pX x 坐标
 * @param {Number} pY y 坐标 
 * @param {Number} width 宽度 
 * @param {Number} height 高度
 */
function drawImageToCanvas(url, pX, pY, width, height) {
    return new Promise((resolve, reject) => {
        const headerImg = this.createImage();
        headerImg.src = url; //微信请求返回头像
        headerImg.onload = () => {
            this.getContext('2d').drawImage(headerImg, pX, pY, width, height);
            resolve()
        }
    })
}
module.exports = {
    TextToArray,
    drawRoundRectPath,
    fillText,
    canvasToTempFilePath,
    drawImageToCanvas
}

到了这里,关于微信分享时自定义分享图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索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日
    浏览(99)
  • 微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

    目录 关键步骤介绍 Component实现自定义授权弹框 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权,若用户已选择同意或拒绝,后续不会再显示授权弹框。 如果授权信息显示未进行相册授权,则打开自定义弹框(show_auth: true)让用户选择是否自行配置

    2024年01月16日
    浏览(46)
  • uniapp微信小程序全局分享和自定义页面分享

    uniapp 实现微信小程序的全局 转发给好友/分享到朋友圈 的功能。主要使用 Vue.js 的 全局混入 概念。 1.在项目根目录创建mixins文件夹,然后创建全局分享的 js 文件。mixins/share.js  2.在项目的 main.js 文件中引入该 share.js 文件并使用 Vue.mixin() 方法将之全局混入: 3.自定义页

    2024年02月13日
    浏览(62)
  • 微信小程序如何自定义分享卡片文案和图片

    微信小程序提供了onShareAppMessage方法,专门用来监听用户点击页面内转发按钮(button 组件 open-type=\\\"share\\\")或右上角菜单“转发”按钮的行为,并自定义转发内容。 注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮 参数 类型 说明 最低版本 from String 转发事

    2024年02月13日
    浏览(50)
  • 微信小程序获取页面节点方法简介。canvas 滑动验证码 (前段,微信小程序,canvas2D)

    目录 一.wx.createSelectorQuery():返回一个 SelectorQuery 对象实例。在自定义组件或包含自定义组件的页面中,应使用 this.createSelectorQuery() 来代替 二.SelectorQuery.select(string selector)  返回值是NodesRef 三.NodesRef  四:执行所有请求 NodesRef SelectorQuery.exec 五: canvas 滑动验证码(使用wx

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

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

    2024年02月13日
    浏览(70)
  • 微信小程序canvas绘制自适应图片,UniApp canvas绘制自适应图片

     需求:画布宽高为686 * 686 的正方形(可以进行调整根据自身需要来)             当图片宽度大于高度时,对图片宽度进行裁剪              当图片高度大于宽度时,对图片高度进行裁剪              我是用uniApp进行开发的,如果是小程序原生,直接把“uni” 改为 “

    2024年02月09日
    浏览(67)
  • 【小程序图片水印】微信小程序图片加水印功能 canvas绘图

    感觉有用的话,可以打赏一把么?一毛不嫌少,十块不嫌多 更多详细代码请关注公众号索取(备注:公众号):

    2024年04月29日
    浏览(50)
  • 微信小程序新版canvas绘制图片方法

    今天在做项目使用到了canvas绘制二维码,发现以前的方法被弃用了。 wxml: 如果想要绘制需要将起临时存储起来,写入成功的就可以进行绘制了。(如果是点击展示二维码,最好是先将数据写到onLoad事件中,在将要绘制的东西写到点击事件中去,在点击事件中去获取数据);

    2024年02月11日
    浏览(46)
  • 微信小程序 新版canvas绘制图片方法

    截至2022.12.23 修改日 微信小程序开发文档介绍不全,导致很多用户绘制图片不显示或失败,因此写下截至目前的可行方案 如果新手不熟悉canvas,先看下小程序官方文档 可运行案例: wxml: js:

    2024年02月12日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包