微信小程序绘制海报

前言

实现海报?你想到的应该是html2canvas吧,但,这里是小程序,好像并不通用。只能用canvas一笔一划去描述了吗?答案肯定是不对的,今天介绍一个Painter插件,它可以帮助你快速完成小程序上的海报功能。

想到小程序中有如此大量的生成图片需求,而 Canvas 生成方法又是如此难用和坑爹(有关小程序的坑,可看 https://github.com/Kujiale-Mobile/MP-Keng )。我们就想到可不可以做一款可以很方便生成图片,并且还能屏蔽掉直接使用 Canvas 的一些坑的库呢?对此我们发起了 “画家计划— 通过 json 数据形式,来进行动态渲染并绘制出图片”。

前期准备

github下载插件需要的文件。下载地址:https://github.com/Kujiale-Mobile/Painter。下载文件后找到文件里面的components/painter,复制整个painter文件夹,到你小程序项目的component目录下,若考虑该文件较大,可以采用分包的形式,将文件放入分包中。

组件形式使用插件

需要绘制海报的页面的.json中添加组件,或者在app.json中添加全局的组件。

{  "usingComponents": {   "painter":"./Components/painter/painter"}
}

绘制界面样式、数据

既然要绘制海报,我们必然需要准备好海报的内容。如:用到的文案、真实的数据、海报素材,包括视频文件、图片文件等等。

准备好以上东西我们需要将这些东西绘制在海报上,我们需要按照一定的格式才能更方便的绘制,而不是像canvas那样一点点去绘制。

这里推荐使用工具Painter海报生成Json工具[https://lingxiaoyi.github.io/painter-custom-poster] 网站。因为使用painter插件可以让我们只要传输Json格式的数据给它,它就能帮我们绘制好页面。在网站内调整好布局后点击复制代码即可拷贝出如下Json格式的代码。

export default class LastMayday {palette(params) {return ({width: "750rpx",height: "1200rpx",background: "#FEF8F3",views: [{type: "image",url: `***/weapp/poster/poster_${params.posterNum}.jpg`,css: {width: "750rpx",height: "1200rpx",top: "0px",left: "0px",mode: "scaleToFill"}},{type: "image",url: `${params.avatar}`,css: {width: "100rpx",height: "100rpx",top: "124rpx",left: "64rpx",borderRadius: "100rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000",borderWidth:"1rpx",borderColor:"#fff"}},{type: "text",text: `${params.userName}`,css: {color: "#fff",width: "200rpx",top: "135rpx",left: "186rpx",fontSize: "32rpx",fontWeight: "bold",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `${params.className}`,css: {color: "#fff",width: "300rpx",top: "175rpx",left: "186rpx",fontSize: "30rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `大学习第${params.term}期`,css: {color: "#fff",width: "300rpx",top: "135rpx",left: "398rpx",fontSize: "30rpx",fontWeight: "bold",textAlign: "right",shadow:"4rpx 4rpx 6rpx #000"}},{type: "image",url: `${params.medalNum>=1?'***/weapp/badge/badge_1.png':''}`,css: {width: "96rpx",top: "280rpx",left: "86rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=2?'***/weapp/badge/badge_2.png':''}`,css: {width: "96rpx",top: "280rpx",left: "182rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=3?'***/weapp/badge/badge_3.png':''}`,css: {width: "96rpx",top: "280rpx",left: "278rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=4?***/weapp/badge/badge_4.png':''}`,css: {width: "96rpx",top: "280rpx",left: "374rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=5?'***/weapp/badge/badge_5.png':''}`,css: {width: "96rpx",top: "280rpx",left: "470rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=6?'*****/weapp/badge/badge_6.png':''}`,css: {width: "96rpx",top: "280rpx",left: "566rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "text",text: "完成率达到",css: {color: "#fff",width: "300rpx",top: "680rpx",left: "105rpx",fontSize: "40rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `${params.ratio}%`,css: {color: "#ff4000",width: "200rpx",top: "678rpx",left: "307rpx",fontSize: "44rpx",fontWeight: "bold",textAlign: "left",shadow: "1rpx 1rpx 2rpx #000"}},{type: "text",text: "速度超过了全国",css: {color: "#fff",width: "300rpx",top: "746rpx",left: "105rpx",fontSize: "40rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `${params.classNum}`,css: {color: "#ff4000",width: "150rpx",top: "814rpx",left: "105rpx",fontSize: "46rpx",fontWeight: "bold",textAlign: "left",shadow: "1rpx 1rpx 2rpx #000"}},{type: "text",text: `个班级`,css: {color: "#fff",width: "400rpx",top: "818rpx",left: `${105+(params.classNum.toString().length)*30}rpx`,fontSize: "40rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},]});}
}

在painter同级目录下新建一个paletle文件夹,然后在其下新建一个poster.js文件。如下:

 这个文件就是用来处理数据和绘制海报的Js。

使用poster文件

在需要绘制海报的页面的.js中引用文件。

import Poster from '../../Components/palette/poster'

然后在你需要开始绘制海报的地方执行如下代码:

let posterParams = {avatar: this.data.avatar,userName: this.data.userName,className: this.data.className,term: this.data.term,ratio: this.data.ratio,classNum: this.data.classNum >= 100000 ? '10万+' : this.data.classNum,medalNum: this.data.medalNum,posterNum: this.data.currentIndex
}
wx.showToast({title: '海报绘制中',icon: 'loading',duration: 3000,
})
this.setData({paintPallette: new Poster().palette(posterParams),
});

可以看到,我们是通过new创建一个Poster实例,然后调用实例的方法palette,方法可以传一个对象,这个对象就是海报需要动态修改的数据。

使用组件

在需要绘制海报的页面的.wxml中使用组件。

<painter customStyle='position: absolute; left: -9999rpx;' palette="{{paintPallette}}" bind:imgOK="onImgOK" bind:imgErr="onImgErr"/>

其中customStyle:是插件支持的自定义样式,如果需要在海报绘制成功后不希望出现在页面上,可以采用如上的position: absolute; left: -9999rpx;

palette:是绘制海报内容的数据,可以传输从服务器返回过来的数据。

imgOK:是海报绘制成功后的回调,imgErr:是海报绘制失败的回调。

onImgOK(e) {that.setData({imagePath: e.detail.path,//绘制后的图片临时地址})
}

 

 

 

踩坑预警

1、使用Painter海报生成Json工具复制的代码会有一部分是没有用的,且加上会出错。

 

可以参考我上面的样式属性。需要用到其他样式属性的可以一点点加上查看效果。

2、绘制出来的海报很模糊。我们需要在绘制图片时加上设备的分辨率,代码在拷贝下来的painter.js,里面找到wx.canvasToTempFilePath...这句代码,绘制的宽高加上getApp().systemInfo.pixelRatio。如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33287.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科研人员和各科老师写的学科春联新鲜出炉,祝您和家人“牛年快乐”!

本文来源&#xff1a;好教师和口袋科研 给各位科研人员的对联&#xff1a;愿成为祝新的一年&#xff0c;多发paper&#xff0c;少掉头发、申基金、评职称两开花&#xff01; 上联&#xff1a;自然科学基金权当寒假作业&#xff0c;莫说科研知音少 下联&#xff1a;重点研发计划…

案例:写春联

案例&#xff1a;写春联 编程代码 import turtleturtle.Screen().bgcolor("#ffc373") # 设置背景颜色为#ffc373&#xff0c;一种黄色。 color_word "black" # 设置书法的颜色为black。 color_paper "#ea182a" # 设置红纸的颜色为#ea182a横…

喜鹊招牌体-喜鹊造字喜鹊字体

喜鹊万人造字体.ttf 喜鹊乌冬面(简 繁体).ttf 喜鹊乐敦体.ttf 喜鹊古字典体(简 繁体).ttf 喜鹊古风小楷(简繁).ttf 喜鹊在山林体&#xff08;简 繁体&#xff09;.OTF 喜鹊小轻松体.TTF 喜鹊招牌体(简 繁体).ttf 喜鹊木叶体(简 繁体).ttf 喜鹊梅花楷体(简 繁体).ttf 喜鹊燕书体…

用canvas绘制微信小程序海报页面并保存相册-适用微信原生

微信小程序绘制海报并保存相册 tip&#xff1a;代码中使用的是uni的api 如果使用原生微信小程序开发&#xff0c;可以把uni更换成wx使用 文章目录 微信小程序绘制海报并保存相册前言一、分析需求二、准备数据三、编码开始html部分解析&#xff1a; js部分1、准备好数据后开始绘…

火爆的AI绘画+红包封面+春联+节日头像+创作者入驻小程序源码

2023年新年&#xff0c;红包封面皮肤在前几年一直都很火爆&#xff0c;每次过年过节&#xff0c;几乎家家都会互发红包进行庆祝贺岁&#xff0c;这个时候一个简单的红包封面就会显得多么的与众不同。 Ai文字绘画&#xff0c;&#xff0c;&#xff0c; 红包封面领取 小程序 …

ChatGPT死活不认27能被3整除,网友:不是说AI要统治世界了吗?

Alex 羿阁 发自 凹非寺量子位 | 公众号 QbitAI 让众人疯狂的网红AI ChatGPT&#xff0c;原来也有明显的短板&#xff1f; 一段“网友调教这只AI”的聊天记录&#xff0c;在网上传开了。 可以看到&#xff0c;AI起初居然说27是个质数。 在网友向其提出质疑后&#xff0c;AI仍嘴硬…

OpenAI 重磅更新 变得更强啦 | 包括更多可控的 API 模型、函数调用能力、更长的上下文和更低的价格

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 官网&#xff1a;https://openai.com/blog/function-calling-and-other-api-updates 功能调用和其他 API 更新。OpenAI 宣布更新&#xff0c;包…

自己写的一段预测双色球号码的Java代码

原理是根据双色球开奖的历史数据&#xff0c;根据各种易经八卦&#xff0c;天时等随机因素预测下一期的双色球号码。 完整代码在我的github上&#xff1a; MainFrame.java是主程序&#xff1a; package ball;public class MainFrame {public static void main(String[] args) …

20211217使用python3通过最近6期的双色球开奖结果预测新一期的号码

20211217使用python3通过最近6期的双色球开奖结果预测新一期的号码 酬金/劳务费用&#xff1a;小奖请吃饭。 大奖给你技术支持费用&#xff01; 按照你如今加班工资的2倍计酬&#xff01; 第一步&#xff0c;希望2周完成&#xff0c;大概完成时间2021-12-15&#xff1a; a1*x1…

《LSTM神经网络和双色球预测例子》

前言&#xff1a; 书接上回&#xff0c;通过把历年来的双色球蓝球数据爬取&#xff0c;可以看出&#xff0c;每期双色球蓝球之间并无任何关系&#xff0c;但仍存在问题&#xff1a; 决定蓝球数字可能并非取决于上一期蓝球的数据&#xff0c;可能取决于当期红球的数据&#xff0…

《基于LSTM神经网络的双色球蓝球数字预测》

结论&#xff1a;没有任何作用&#xff0c;基本可以断定这是真正随机的数字。 LSTM神经网络&#xff0c;单步预测&#xff0c;循环2000次&#xff0c;100个神经元&#xff0c;无dropout。 蓝线&#xff1a;最近50期蓝球数字 橙线&#xff1a;LSTM网络预测数字 绿线&#xff1a…

数学建模预测模型实例(三)---双色球概率预测模型

双色球概率预测模型 数学建模预测模型实例&#xff08;一&#xff09;—大学生体测数据模型 数学建模预测模型实例&#xff08;二&#xff09;—表白墙影响力量化模型 python预测算法—线性回归 双色球概率预测模型 前言 最近新晋彩民佩瑞对于双色球产生了极为浓厚的兴趣&am…

AIGC 工具推荐:利用 AI 提高工作效率的利器

人工智能&#xff08;AI&#xff09;正在改变我们的生活&#xff0c;使我们的工作更加高效和智能化。在这个快速发展的领域中&#xff0c;有许多 AI 实用工具可以帮助我们更好地完成工作。在未来熟练使用各种 AI 工具优化你的工作流并提高工作效率将是每个人的必备技能&#xf…

Ubuntu Go语言环境配置【GPT-4版】

目录 go语言的培训网课安装goGPT-4给出的过程在VSCode里怎样正确配置好Go的调试相关设置&#xff1f;如果我在Visual Studio Code中安装Go语言的相关工具总是失败怎么办&#xff1f;我已重启Visual Studio Code&#xff0c;接下来应该怎样检查日志&#xff1f;如果我还是不能成…

Monica - 你的 GPT-4 人工智能助手

Monica介绍 官方地址&#xff1a;https://monica.im/?cX0OHBN1S &#xff08;仅限今天&#xff0c;通过这里注册可免费获取100次Monica查询&#xff09; Monica 是一款由 ChatGPT API 提供支持的扩展程序&#xff0c;它可以与您讨论任何事情&#xff0c;使用 80 多个模板生成文…

初学者使用Auto-GPT入门:设置和使用

初学者使用Auto-GPT入门&#xff1a;设置和使用 简介&#xff1a;1. 快速演示2. 要求3. 设置OpenAI使用限制&#xff08;可选&#xff09;4. 安装Python5. 安装Git6. 安装 virtualenvwrapper&#xff08;可选&#xff09;6.1 使用 pip&#xff0c;您可以轻松地在 Python 环境中…

最近热门话题-Auto GPT 初学者Auto GPT 入门:设置和使用

Auto-GPT 是一个实验性的开源应用程序&#xff0c;展示了著名的 GPT-4 语言模型的功能。 它使用 GPT-4 执行复杂的任务并实现目标&#xff0c;而无需太多人工输入。 Auto-GPT将OpenAI的GPT模型的多个实例链接在一起&#xff0c;允许它做一些事情&#xff0c;比如在没有帮助的…

GPT国内使用

国内可用的 ChatGPT 替代 列表 功能和使用 顺便推荐 列表https://chatgpt.qdymys.cn/ &#xff1a;三小时只能用10次 https://alllinkai.com/&#xff1a;体验完&#xff0c;要登录&#xff0c;不推荐 https://gpttalk.live/ &#xff1a;每天限制使用次数 https://chatgpt-…

信息收集----浏览器,网络空间搜索引擎

目录 一.浏览器搜索 1.什么是Google Hacking 2.高级搜索 3.示例 4.工具 二.网络空间搜索引擎 1.什么是网络空间搜索引擎 2.Shodan的使用 3.Censys&#xff0c;Zomeye,Fofa介绍 1.Censys 2.zoomeye 3.fofa 4.总结对比 5.基于网络空间搜索引擎的工具 一.浏览器搜索 1…

VC++实现双人对决的围棋程序,阿尔法狗围棋

可以双人对决的VC围棋程序&#xff0c;送给我梦中的情人。虽然程序不很复杂&#xff0c;但必竟是我自己亲手写噢&#xff0c;而且还得到了女朋友的夸张&#xff0c;通过编写这个小程序&#xff0c;让我对VC有了更深层的了解&#xff0c;想要的下载。游戏打开后可以选择适合15、…