基本介绍

最终实现的需求是: 将海报模版与自己上传的照片进行合成并且贴上二维码,生成可长按保存的海报。

海报H5的基本功能:

  1. 接入微信SDK
  2. 上传照片、拍照
  3. 裁剪图片
  4. 将海报模板、二维码、上传的照片合成海报
  5. 长按保存图片

方案选择

  • 方案一: 采用第三方的裁剪库PhotoClip,和canvas的drawImage进行合成

  • 方案二: 采用第三方的裁剪库PhotoClip,和html2canvas纯前端合成

方案选择:

  1. 方案一:需要解决移动端图片失真问题严重,二维码需要后台贴
  2. 方案二:可前端进行合成,图片还原度高

小结: 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。

解决方案:

  1. 服务端将图片配置Access-Control-Allow-Origin: *
  2. 设置html2canvasuseCORS[配置](html2canvas.hertzen.com/configurati…)
  3. 强制性跨域请求可使用crossorigin=“anonymous”属性

drawImage图片失真

解决方案:根据devicePixelRatiocanvas进行操作

具体步骤:

  1. canvaswidthheight放大devicePixelRatio
  2. canvas.style.widthcanvas.style.height设置为原来大小
  3. 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制作海报相关推荐

  1. H5上传图片并使用canvas制作海报

    马上就要"十一"国庆节了,又恰逢公司已经三周岁了,所以市场部和产品共同策划了一个"正青春,共成长"的主题代言活动,准备在国庆节以及中秋节期间让公司员工和用户为公 ...

  2. 前端Vue H5生成带二维码的分享海报,实现长按保存到手机相册

    前端Vue H5生成带二维码的分享海报,实现长按保存到手机相册 前言:关于H5分享海报的需求,经常会遇到,通常就是一个分享的二维码+分享文案,生成一张图片,供用户在手机上长按保存到手机,然后就可以将保 ...

  3. Java5分钟制作海报

    一.需求背景 我们经常在多终端应用开发中会遇到这样的需求:用户在浏览商品时觉得不错,希望分享给朋友.此时终端(安卓.苹果.H5等)生成一张精美的商品海报,通过微信或者其他途径分享给他人.也可能会遇到需 ...

  4. 教你Java5分钟制作海报、彻底解决APP兼容性问题

    教你Java5分钟制作海报.彻底解决APP兼容性问题 一.需求背景 ​ 我们经常在多终端应用开发中会遇到这样的需求:用户在浏览商品时觉得不错,希望分享给朋友.此时终端(安卓.苹果.H5等)生成一张精美 ...

  5. h5难做吗_还在担心H5太难做?介绍一个H5制作工具给你!

    H5发展越来越快,不得不让企业营销人对H5页面的未来充满了期待,越来越多的人开始在营销中运用H5页面.但是也有许多人陷入了一个难题,即没有技术怎么制作H5.其实,H5页面的制作很简单,只需要一个工具就 ...

  6. html5微杂志源码,H5制作又一利器:分分钟制作一个H5页面

    在当下"移动+社交"的传播时代,HTML5营销凭借简单快捷.灵活炫酷的特性吸引了大批用户认可和使用,并逐渐形成了移动营销的一个新热点. 一份H5海报通常涵盖文字.图片.音乐(声音) ...

  7. 从手机端 H5 制作来看 WEB 动画的术与道

    我们在微信朋友圈里经常看到很多人分享 H5 的链接,有的科技感十足,有的展示炫目,有的非常有创意,各大公司也把H5作为他们品牌传播,活动预热的很好方式.企业商户对于这种方式也很有好感,从而导致了 H5 ...

  8. 前端实现高效的海报系统

    前言 众所周知,海报作为一种最为常见的招贴形式,被广泛应用于广告宣传等场景.随着互联网的快速发展,网络营销逐渐成为引流和获客的重要手段,形式多样的海报也在线上营销裂变活动中发挥着不可或缺的作用.与传统 ...

  9. java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题

    文章目录 先看成品 前言 一.项目目录结构 一.海报制作PosterUtil.java工具类 1. 描述 2. 代码 二.测试生成海报 1. 描述 2. 直接上代码 四.其他测试 1. Test1_C ...

  10. 海报css_如何使用HTML和CSS为《复仇者联盟:无限战争》制作海报

    海报css by Kunal 由Kunal 如何使用HTML和CSS为<复仇者联盟:无限战争>制作海报 (How to make a poster for Avengers: Infini ...

最新文章

  1. 2003 SERVER 本地连接 TCP/IP问题[转]
  2. 博客园T恤PP泄漏版(附图)
  3. java抽象类与接口区别6_java基础知识(6)---抽象类与接口
  4. 每日程序C语言46-函数之间的调用
  5. Java Websocket实例
  6. Java集合---HashMap源码剖析
  7. java验证码(采用struts2实现)
  8. DW CS5及CC的部分序列号总结
  9. CSS基础(六)——还原设计稿
  10. [2017BUAA软工助教]博客格式的详细说明
  11. 毕业后,他年薪百万,我年薪刚破十万,人和人之间的差距怎么这么大?
  12. 第三方服务(文件,图片存储)
  13. XOR Guessing
  14. 影像组学|影像组学导论
  15. Spring和mima结合配置IoAccept中的sessionConfig中的属性
  16. Vue中登录验证成功后保存token,并每次请求携带并验证token操作
  17. 家用双wan口路由器推荐_什么路由器有两个以太口 家用双wan口路由器推荐
  18. IOS - 七大手势操作
  19. 华为操作系统鸿蒙 hms生态系统,华为HMS生态系统服务是什么 鸿蒙操作系统机会来了...
  20. Google 国内外镜像地址:

热门文章

  1. Flowable工作流(flowable 数据库表结构)
  2. NPN与PNP型传感器的区别
  3. AD 画PCB 布线时,连线就变绿
  4. 计算机视觉数据集大全 - Part1
  5. 交换机的作用及应用原理
  6. boder sizing:boder-box的使用意义
  7. mro python_Python-MRO
  8. 【实验】【视图】使用v$bgprocess视图获得所有后台进程信息
  9. 隐藏部分内容,点击按钮显示全部内容
  10. 图片制作、LOGO制作、ICO文件