移动端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实现炫酷的飞机起飞动画
Sep 17 HTML / CSS
CSS3实现闪烁动画效果的方法
Feb 09 HTML / CSS
CSS3中的常用选择器使用示例整理
Jun 13 HTML / CSS
CSS3中Transition动画属性用法详解
Jul 04 HTML / CSS
Html5上传图片 移动端、PC端通用代码
Jun 08 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
Jul 17 HTML / CSS
canvas学习笔记之绘制简单路径
Jan 28 HTML / CSS
利用HTML5绘制点线面组成的3D图形的示例
May 12 HTML / CSS
详解HTML5中的manifest缓存使用
Sep 09 HTML / CSS
HTML5有哪些新特征
Dec 01 HTML / CSS
详解px单位html5响应式方案
Mar 08 HTML / CSS
HTML怎么设置下划线?html文字加下划线方法
Dec 06 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
php MYSQL 数据备份类
2009/06/19 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
js 操作select相关方法函数
2009/12/06 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
最新的互联网创业计划书
2014/01/10 职场文书
离职保密承诺书
2014/05/28 职场文书
2014年人大工作总结
2014/12/10 职场文书
在Python中如何使用yield
2021/06/07 Python
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang