资讯专栏INFORMATION COLUMN

移动端H5页面生成图片解决方案

sewerganger / 2010人阅读

摘要:现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传生成图片可以用但是由于已经有了这个开源库,所以为了节省时间就没有自己写了地址少啰嗦,先看东西根据获取像素比将传入值转为整数绘制获取想要

现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传!

1.

生成图片可以用canvas,但是由于已经有了html2canvas这个开源库,所以为了节省时间就没有自己写了

github地址: html2canvas

少啰嗦,先看东西!!!

LiveDemo

</>复制代码

  1. /**
  2. * 根据window.devicePixelRatio获取像素比
  3. */
  4. function DPR() {
  5. if (window.devicePixelRatio && window.devicePixelRatio > 1) {
  6. return window.devicePixelRatio;
  7. }
  8. return 1;
  9. }
  10. /**
  11. * 将传入值转为整数
  12. */
  13. function parseValue(value) {
  14. return parseInt(value, 10);
  15. };
  16. /**
  17. * 绘制canvas
  18. */
  19. async function drawCanvas (selector) {
  20. // 获取想要转换的 DOM 节点
  21. const dom = document.querySelector(selector);
  22. const box = window.getComputedStyle(dom);
  23. // DOM 节点计算后宽高
  24. const width = parseValue(box.width);
  25. const height = parseValue(box.height);
  26. // 获取像素比
  27. const scaleBy = DPR();
  28. // 创建自定义 canvas 元素
  29. var canvas = document.createElement("canvas");
  30. // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
  31. canvas.width = width * scaleBy;
  32. canvas.height = height * scaleBy;
  33. // 设定 canvas css宽高为 DOM 节点宽高
  34. canvas.style.width = `${width}px`;
  35. canvas.style.height = `${height}px`;
  36. // 获取画笔
  37. const context = canvas.getContext("2d");
  38. // 将所有绘制内容放大像素比倍
  39. context.scale(scaleBy, scaleBy);
  40. let x = width;
  41. let y = height;
  42. return await html2canvas(dom, {canvas}).then(function () {
  43. convertCanvasToImage(canvas, x ,y)
  44. })
  45. }
  46. /**
  47. * 图片转base64格式
  48. */
  49. function convertCanvasToImage(canvas, x, y) {
  50. let image = new Image();
  51. let _container = document.getElementsByClassName("container")[0];
  52. let _body = document.getElementsByTagName("body")[0];
  53. image.width = x;
  54. image.height = y;
  55. image.src = canvas.toDataURL("image/png");
  56. _body.removeChild(_container);
  57. document.body.appendChild(image);
  58. return image;
  59. }
  60. drawCanvas(".container")
2.

由于现在的手机都是高清屏,所以如果你不做处理就会出现模糊的情况,为什么会出现模糊的情况?这个就涉及到设备像素比 devicePixelRatio js 提供了 window.devicePixelRatio 可以获取设备像素比

</>复制代码

  1. function DPR() {
  2. if (window.devicePixelRatio && window.devicePixelRatio > 1) {
  3. return window.devicePixelRatio;
  4. }
  5. return 1;
  6. }

这个DPR函数就是获取设备的像素比, 那获取像素比之后要做什么呢?

</>复制代码

  1. var canvas = document.createElement("canvas");
  2. // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
  3. canvas.width = width * scaleBy;
  4. canvas.height = height * scaleBy;
  5. // 设定 canvas css宽高为 DOM 节点宽高
  6. canvas.style.width = `${width}px`;
  7. canvas.style.height = `${height}px`;
  8. // 获取画笔
  9. const context = canvas.getContext("2d");
  10. // 将所有绘制内容放大像素比倍
  11. context.scale(scaleBy, scaleBy);
3.

获取设备像素比之后将canavs.width 和 canvas.height 去乘以设备像素比 也就是 scaleBy; 这个时候在去设置canvas.style.width 和 canvas.style.height 为dom的宽和高。想想为什么要这么写?最后在绘制的饿时候将所绘制的内容放大像素比倍

举个例子iphone6S是设备宽高是375 X 667 ,6S的 window.devicePixelRatio = 物理像素 / dips(2=750/375)所以设计师一般给你的设计稿是不是都是750*1334的?

所以如果按照一比一去绘制在高清屏下就会模糊,看图说话6S DPR=2

6plus DPR=3

4.

最后调用canvas.toDataURL("image/png");赋值给image.src,由于微信里面无法保存图片,所以只能生成图片文件,调用微信自带的长按保存到图片到相册功能,如图:

5.

参考文章

一次 H5 「保存页面为图片」 的踩坑之旅

设备像素比devicePixelRatio简单介绍

html5 canvas在高倍屏下变模糊的处理办法

基于html2canvas实现网页保存为图片及图片清晰度优化

Window.devicePixelRatio

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/113665.html

相关文章

  • 移动H5页面注意事项

    摘要:移动端活动页面常常需要能够分享到各种社交中,常用的有微信等。微信二维码问题同一个页面里要是有两个二维码,长按扫描总是只能扫出左侧第一个二维码。 首发于简书博客:http://www.jianshu.com/p/e958... 2017-11-25 更新:5. 使用 Gulp 拼合图片 1. 单个页面内容不能过多 设计常用尺寸:750 x 1334 / 640 x 1134,包含了手机顶...

    weknow619 评论0 收藏0
  • 移动H5页面注意事项

    摘要:移动端活动页面常常需要能够分享到各种社交中,常用的有微信等。微信二维码问题同一个页面里要是有两个二维码,长按扫描总是只能扫出左侧第一个二维码。 首发于简书博客:http://www.jianshu.com/p/e958... 2017-11-25 更新:5. 使用 Gulp 拼合图片 1. 单个页面内容不能过多 设计常用尺寸:750 x 1334 / 640 x 1134,包含了手机顶...

    madthumb 评论0 收藏0
  • 移动H5页面生成图片解决方案

    摘要:现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传生成图片可以用但是由于已经有了这个开源库,所以为了节省时间就没有自己写了地址少啰嗦,先看东西根据获取像素比将传入值转为整数绘制获取想要 现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传! 1. 生成图片可以用canvas,但...

    Neilyo 评论0 收藏0
  • 移动 - 收藏集 - 掘金

    摘要:使用移动设备查看页面时会发现,在微信浏览器中有顶部导航栏有效解决图片使用单位边角缺失的问题前端掘金起因在移动端使用布局时图片也需要用单位。移动端实践前端掘金说起,相信大家并不陌生。 Sticky Footer,完美的绝对底部 - 前端 - 掘金写在前面 做过网页开发的同学想必都遇到过这样尴尬的排版问题:在主体内容不足够多或者未完全加载出来之前,就会导致出现(图一)的这种情况,原因是因为...

    Jochen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<