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


Posted in HTML / CSS onAugust 07, 2018

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

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

github地址: html2canvas

少??拢?瓤炊?鳎。。?/p>

LiveDemo

/**
     * 根据window.devicePixelRatio获取像素比
     */
    function DPR() {
        if (window.devicePixelRatio && window.devicePixelRatio > 1) {
            return window.devicePixelRatio;
        }
        return 1;
    }
    /**
     *  将传入值转为整数
     */
    function parseValue(value) {
        return parseInt(value, 10);
    };
    /**
     * 绘制canvas
     */
    async function drawCanvas (selector) {
        // 获取想要转换的 DOM 节点
        const dom = document.querySelector(selector);
        const box = window.getComputedStyle(dom);
        // DOM 节点计算后宽高
        const width = parseValue(box.width);
        const height = parseValue(box.height);
        // 获取像素比
        const scaleBy = DPR();
        // 创建自定义 canvas 元素
        var canvas = document.createElement('canvas');
        // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
        canvas.width = width * scaleBy;
        canvas.height = height * scaleBy;
        // 设定 canvas css宽高为 DOM 节点宽高
        canvas.style.width = `${width}px`;
        canvas.style.height = `${height}px`;

        // 获取画笔
        const context = canvas.getContext('2d');

        // 将所有绘制内容放大像素比倍
        context.scale(scaleBy, scaleBy);

        let x = width;
        let y = height;
        return await html2canvas(dom, {canvas}).then(function () {
            convertCanvasToImage(canvas, x ,y)
        })
    }

    /**
     * 图片转base64格式
     */
    function convertCanvasToImage(canvas, x, y) {
        let image = new Image();
        let _container = document.getElementsByClassName('container')[0];
        let _body = document.getElementsByTagName('body')[0];
        image.width = x;
        image.height = y;
        image.src = canvas.toDataURL("image/png");
        _body.removeChild(_container);
        document.body.appendChild(image);
        return image;
    }
    drawCanvas('.container')

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

function DPR() {
        if (window.devicePixelRatio && window.devicePixelRatio > 1) {
            return window.devicePixelRatio;
        }
        return 1;
    }

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

var canvas = document.createElement('canvas');
        // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
        canvas.width = width * scaleBy;
        canvas.height = height * scaleBy;
        // 设定 canvas css宽高为 DOM 节点宽高
        canvas.style.width = `${width}px`;
        canvas.style.height = `${height}px`;

        // 获取画笔
        const context = canvas.getContext('2d');

        // 将所有绘制内容放大像素比倍
        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

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

6plus DPR=3

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
Jun 03 HTML / CSS
CSS Grid布局教程之什么是网格布局
Dec 30 HTML / CSS
CSS3实现swap交换动画
Jan 19 HTML / CSS
使用CSS3美化HTML表单的技巧演示
May 17 HTML / CSS
CSS3 animation实现逐帧动画效果
Jun 02 HTML / CSS
HTML5 实现一个访问本地文件的实例
Dec 13 HTML / CSS
使用HTML5拍照示例代码
Aug 06 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
Dec 30 HTML / CSS
使用html5制作loading图的示例
Apr 14 HTML / CSS
简单整理HTML5的基本特性和语法
Feb 18 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
Apr 23 HTML / CSS
详解window.open被浏览器拦截的解决方案
Jul 18 HTML / CSS
详解WebSocket跨域问题解决
Aug 06 #HTML / CSS
canvas实现二维码和图片合成的示例代码
Aug 01 #HTML / CSS
HTML5拖拽功能实现的拼图游戏
Jul 31 #HTML / CSS
Html5页面二次分享的实现
Jul 30 #HTML / CSS
利用Storage Event实现页面间通信的示例代码
Jul 26 #HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
Jul 24 #HTML / CSS
htnl5利用svg页面高斯模糊的方法
Jul 20 #HTML / CSS
You might like
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
js实现小时钟效果
2020/03/25 Javascript
python实现kMeans算法
2017/12/21 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python实现随机漫步方法和原理
2019/06/10 Python
python的debug实用工具 pdb详解
2019/07/12 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
C#面试常见问题
2013/02/25 面试题
Linux开机引导的步骤是什么
2015/10/19 面试题
高中自我鉴定范文
2013/11/03 职场文书
物业电工岗位职责
2013/11/20 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
20年同学聚会感言
2014/02/03 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
国庆横幅标语
2014/10/08 职场文书
满月酒邀请函
2015/01/30 职场文书
JavaScript流程控制(循环)
2021/12/06 Javascript
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技