移动端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动画和opacity透明度实现呼吸灯效果
Aug 09 HTML / CSS
用CSS禁用输入法(CSS3 UI规范)实例解析
Dec 04 HTML / CSS
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
Dec 28 HTML / CSS
纯css3显示隐藏一个div特效的具体实现
Feb 10 HTML / CSS
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
Mar 31 HTML / CSS
css3新增颜色表示方式分享
Apr 15 HTML / CSS
css3的focus-within选择器的使用
May 11 HTML / CSS
HTML5的标签的代码的简单介绍 HTML5标签的简介
May 28 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(一)
Jan 21 HTML / CSS
HTML5新特性 多线程(Worker SharedWorker)
Apr 24 HTML / CSS
Html5 webRTC简单实现视频调用的示例代码
Sep 23 HTML / CSS
深入理解margin塌陷和margin合并的解决方案
Jun 26 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
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
python创建临时文件夹的方法
2015/07/06 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
python 实现二维列表转置
2019/12/02 Python
Python print不能立即打印的解决方式
2020/02/19 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
幼儿园开学家长寄语
2014/01/19 职场文书
个人自我剖析材料
2014/02/07 职场文书
电子商务专业求职信
2014/03/08 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
java版 联机五子棋游戏
2022/05/04 Java/Android
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript