移动端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 12 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
Feb 29 HTML / CSS
纯CSS3代码实现文字描边
Apr 25 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
May 05 HTML / CSS
HTML5验证以及日期显示的实现详解
Jul 05 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
May 14 HTML / CSS
用HTML5制作烟火效果的教程
May 12 HTML / CSS
深入探究HTML5的History API
Jul 09 HTML / CSS
详解HTML5中download属性的应用
Aug 06 HTML / CSS
浅谈移动端中的视口(viewport)的具体使用
Apr 13 HTML / CSS
CSS3实现的3D隧道效果
Apr 27 HTML / CSS
HTML中link标签属性的具体用法
May 07 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生成便于打印的网页
2006/10/09 PHP
构建简单的Webmail系统
2006/10/09 PHP
php csv操作类代码
2009/12/14 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
JS 有名函数表达式全面解析
2010/03/19 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
pygame播放音乐的方法
2015/05/19 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python安装后的目录在哪里
2020/06/21 Python
python如何写try语句
2020/07/14 Python
Python内置函数及功能简介汇总
2020/10/13 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
保密承诺书范文
2014/03/27 职场文书
会员卡清退活动总结
2014/08/27 职场文书
践行三严三实心得体会
2014/10/13 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
医生辞职信范文
2015/03/02 职场文书
总经理岗位职责范本
2015/04/01 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python