前端实现H5制作海报
基本介绍
最终实现的需求是: 将海报模版与自己上传的照片进行合成并且贴上二维码,生成可长按保存的海报。
海报H5的基本功能:
- 接入微信SDK
- 上传照片、拍照
- 裁剪图片
- 将海报模板、二维码、上传的照片合成海报
- 长按保存图片
方案选择
方案一: 采用第三方的裁剪库PhotoClip,和canvas的
drawImage
进行合成方案二: 采用第三方的裁剪库PhotoClip,和
html2canvas
纯前端合成
方案选择:
- 方案一:需要解决移动端图片失真问题严重,二维码需要后台贴
- 方案二:可前端进行合成,图片还原度高
小结: html2canvas
确实是目前实现网页保存为图片的综合选择。
实现步骤
1. 接入微信SDK
主要参考官方文档
主要根据后台接口获取appId和signature,最后用wx.config
获取所需接口的权限,比如:调用本地上传图片等
前端采用vue框架,所以直接npm
引入weixin-js-sdk
2. 实现关键功能上传照片,进行裁剪,合成海报
最终采用的是方案二
方案一
采用第三方的裁剪库PhotoClip,和canvas的drawImage
进行合成
- 在移动设备上双指捏合为缩放,双指转动为旋转
- 在PC设备上鼠标滚轮为缩放,每次双击则顺时针旋转90度
裁剪成功后,用drawImage
合成海报
关键代码
// 解决移动端图片合成失真问题const ctx = this.canvas.getContext("2d");const dpr = this.getPixelRatio(ctx);var oldWidth = this.canvas.width;var oldHeight = this.canvas.height;this.canvas.style.width = oldWidth + 'px'; this.canvas.style.height = oldHeight + 'px';this.canvas.width = oldWidth * dpr;this.canvas.height = oldHeight * dpr;ctx.scale(dpr, dpr);// 将两张图画进canvasctx.drawImage(this.$refs.cropImg, 0, 0, 250, 400); // 裁剪后图片ctx.drawImage(this.$refs.postImg, 0, 0, 250, 400); // 海报模板// 合成后,将图片传给后台贴二维码this.canvas.toBlob()// 获取dprgetPixelRatio: function(context) {let backingStore = context.backingStorePixelRatio ||context.webkitBackingStorePixelRatio ||context.mozBackingStorePixelRatio ||context.msBackingStorePixelRatio ||context.oBackingStorePixelRatio ||context.backingStorePixelRatio || 1;return (window.devicePixelRatio || 1) / backingStore;}
复制代码
if (!HTMLCanvasElement.prototype.toBlob) {Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", {value: function(callback, type, quality) {var binStr = atob(this.toDataURL(type, quality).split(",")[1]),len = binStr.length,arr = new Uint8Array(len);for (var i = 0; i < len; i++) {arr[i] = binStr.charCodeAt(i);}callback(new Blob([arr], { type: type || "image/png" }));}});}
复制代码
方案二 采用第三方的裁剪库PhotoClip,和html2canvas
纯前端合成
裁剪后将模版图,裁剪图,和二维码一起通过html2canvas
直接合成canvas即可
关键代码
// 调用本地相册
<input type="file" accept="image/*" capture="camera" size="30">
// accept="image/*;capture=camera" 直接调用相机
// accept="image/*" 调用相机 图片或者相册
复制代码
// 初始化插件let pc = new PhotoClip('#top', {size: [250,444],outputSize: [750,1334],maxZoom : 3,outputQuality: 1,lrzOption:{quality:1},adaptive: ['60%', '80%'],// file: '#file',view: '#view',ok: '#clipBtn',//是否开启图片自由旋转rotateFree: true,img: 'img/mm.jpg',loadStart: function () {},loadComplete: function() {console.log('照片读取完成');},done: function(dataURL) {console.log('dataURL:', dataURL)},//剪裁失败fail: function (err) {//msg(err);},//图片加载失败loadError: function(err) {msg(err); } });// html2canvas合成html2canvas(document.querySelector("#img-box"),{scale: 6,width: document.querySelector('.img-box').offsetWidth,heith: document.querySelector('.img-box').offsetHeight,}).then(function(canvas){//生成海报,将图片追加进domvar img = new Image();img.src = canvas.toDataURL('image/jpg');img.style.maxHeight = '100%'img.style.maxWidth = '100%'img.onload = () => {document.querySelector('.create-poster').append(img)document.querySelector('#img-box').removeChild}})复制代码
踩坑记录
图片跨域
由于canvas对图片资源有同源限制
如果图片的服务器允许跨域访问这个图片,那么你可以使用这个图片而不污染canvas,否则,使用这个图片将会污染canvas。
解决方案:
- 服务端将图片配置
Access-Control-Allow-Origin: *
- 设置
html2canvas
的useCORS
[配置](html2canvas.hertzen.com/configurati…) - 强制性跨域请求可使用
crossorigin=“anonymous”
属性
drawImage图片失真
解决方案:根据devicePixelRatio
对canvas
进行操作
具体步骤:
canvas
的width
和height
放大devicePixelRatio
倍canvas.style.width
和canvas.style.height
设置为原来大小canvas.scale(devicePixelRatio, devicePixelRatio)
进行缩放
具体代码
const ctx = this.canvas.getContext("2d");const dpr = this.getPixelRatio(ctx);var oldWidth = this.canvas.width;var oldHeight = this.canvas.height;this.canvas.style.width = oldWidth + 'px'; this.canvas.style.height = oldHeight + 'px';this.canvas.width = oldWidth * dpr;this.canvas.height = oldHeight * dpr;ctx.scale(dpr, dpr);//进行图片合成ctx.drawImage(this.$refs.cropImg, 0, 0, 250, 400);ctx.drawImage(this.$refs.postImg, 0, 0, 250, 400);// dprgetPixelRatio: function(context) {let backingStore = context.backingStorePixelRatio ||context.webkitBackingStorePixelRatio ||context.mozBackingStorePixelRatio ||context.msBackingStorePixelRatio ||context.oBackingStorePixelRatio ||context.backingStorePixelRatio || 1;return (window.devicePixelRatio || 1) / backingStore;}
复制代码
二维码图片的位置定位
问题: 如何让二维码图片在不同屏幕下都定位到正确的位置。
解决方法: 设为绝对定位,使用屏幕宽度作为基准设置 left、top 值。
.qr-code {width: 10vw;position: absolute;left: 1vw;top: 2vw;
}
复制代码
html2canvas
读取透明底png图片变为不透明
暂未解决
html2canvas合成图的大小动态设置
由于移动端需要进行适配,所以需要动态获取宽高进行设置合成图的宽高
html2canvas(document.querySelector("#img-box"),{scale: 6,width: document.querySelector('#img-box').offsetWidth,heith: document.querySelector('#img-box').offsetHeight,}).then(function(canvas){//生成海报,将图片追加进domvar img = new Image();img.src = canvas.toDataURL('image/jpg');img.style.maxHeight = '100%'img.style.maxWidth = '100%'img.onload = () => {document.querySelector('.create-poster').append(img)}})}
复制代码
附上源码
转载于:https://juejin.im/post/5d207b1e6fb9a07ee85c4b40
前端实现H5制作海报相关推荐
- H5上传图片并使用canvas制作海报
马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...
- 前端Vue H5生成带二维码的分享海报,实现长按保存到手机相册
前端Vue H5生成带二维码的分享海报,实现长按保存到手机相册 前言:关于H5分享海报的需求,经常会遇到,通常就是一个分享的二维码+分享文案,生成一张图片,供用户在手机上长按保存到手机,然后就可以将保 ...
- Java5分钟制作海报
一.需求背景 我们经常在多终端应用开发中会遇到这样的需求:用户在浏览商品时觉得不错,希望分享给朋友.此时终端(安卓.苹果.H5等)生成一张精美的商品海报,通过微信或者其他途径分享给他人.也可能会遇到需 ...
- 教你Java5分钟制作海报、彻底解决APP兼容性问题
教你Java5分钟制作海报.彻底解决APP兼容性问题 一.需求背景 我们经常在多终端应用开发中会遇到这样的需求:用户在浏览商品时觉得不错,希望分享给朋友.此时终端(安卓.苹果.H5等)生成一张精美 ...
- h5难做吗_还在担心H5太难做?介绍一个H5制作工具给你!
H5发展越来越快,不得不让企业营销人对H5页面的未来充满了期待,越来越多的人开始在营销中运用H5页面.但是也有许多人陷入了一个难题,即没有技术怎么制作H5.其实,H5页面的制作很简单,只需要一个工具就 ...
- html5微杂志源码,H5制作又一利器:分分钟制作一个H5页面
在当下"移动+社交"的传播时代,HTML5营销凭借简单快捷.灵活炫酷的特性吸引了大批用户认可和使用,并逐渐形成了移动营销的一个新热点. 一份H5海报通常涵盖文字.图片.音乐(声音) ...
- 从手机端 H5 制作来看 WEB 动画的术与道
我们在微信朋友圈里经常看到很多人分享 H5 的链接,有的科技感十足,有的展示炫目,有的非常有创意,各大公司也把H5作为他们品牌传播,活动预热的很好方式.企业商户对于这种方式也很有好感,从而导致了 H5 ...
- 前端实现高效的海报系统
前言 众所周知,海报作为一种最为常见的招贴形式,被广泛应用于广告宣传等场景.随着互联网的快速发展,网络营销逐渐成为引流和获客的重要手段,形式多样的海报也在线上营销裂变活动中发挥着不可或缺的作用.与传统 ...
- java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
文章目录 先看成品 前言 一.项目目录结构 一.海报制作PosterUtil.java工具类 1. 描述 2. 代码 二.测试生成海报 1. 描述 2. 直接上代码 四.其他测试 1. Test1_C ...
- 海报css_如何使用HTML和CSS为《复仇者联盟:无限战争》制作海报
海报css by Kunal 由Kunal 如何使用HTML和CSS为<复仇者联盟:无限战争>制作海报 (How to make a poster for Avengers: Infini ...
最新文章
- 2003 SERVER 本地连接 TCP/IP问题[转]
- 博客园T恤PP泄漏版(附图)
- java抽象类与接口区别6_java基础知识(6)---抽象类与接口
- 每日程序C语言46-函数之间的调用
- Java Websocket实例
- Java集合---HashMap源码剖析
- java验证码(采用struts2实现)
- DW CS5及CC的部分序列号总结
- CSS基础(六)——还原设计稿
- [2017BUAA软工助教]博客格式的详细说明
- 毕业后,他年薪百万,我年薪刚破十万,人和人之间的差距怎么这么大?
- 第三方服务(文件,图片存储)
- XOR Guessing
- 影像组学|影像组学导论
- Spring和mima结合配置IoAccept中的sessionConfig中的属性
- Vue中登录验证成功后保存token,并每次请求携带并验证token操作
- 家用双wan口路由器推荐_什么路由器有两个以太口 家用双wan口路由器推荐
- IOS - 七大手势操作
- 华为操作系统鸿蒙 hms生态系统,华为HMS生态系统服务是什么 鸿蒙操作系统机会来了...
- Google 国内外镜像地址: