JavaScript之移动端H5生成图片解决方案讲解

 更新时间:2021年08月09日 08:34:34   作者:千羽千寻  
这篇文章主要介绍了JavaScript之移动端H5生成图片解决方案讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

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

1.

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

github地址: html2canvas

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

6plus DPR=3

4.

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

到此这篇关于JavaScript之移动端H5生成图片解决方案讲解的文章就介绍到这了,更多相关JavaScript之移动端H5生成图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js实现鼠标悬浮框效果

    js实现鼠标悬浮框效果

    这篇文章主要为大家详细介绍了js实现鼠标悬浮框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 为原生js Array增加each方法

    为原生js Array增加each方法

    为原生js Array增加each方法,通过prototype来增加功能,进行扩展
    2012-04-04
  • JS实现非首屏图片延迟加载的示例

    JS实现非首屏图片延迟加载的示例

    下面小编就为大家分享一篇用JS实现非首屏图片延迟加载的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 微信小程序开发的基本流程步骤

    微信小程序开发的基本流程步骤

    这篇文章主要介绍了微信小程序开发的基本流程步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • JavaScript中的对象继承关系

    JavaScript中的对象继承关系

    这篇文章主要介绍了JavaScript中的对象继承关系的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • 微信小程序搜索功能(附:小程序前端+PHP后端)

    微信小程序搜索功能(附:小程序前端+PHP后端)

    这篇文章主要介绍了微信小程序搜索功能(附:小程序前端+PHP后端),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Bootstrap 粘页脚效果

    Bootstrap 粘页脚效果

    Bootstrap 粘页脚,说得具体一点就是“将固定高度的页脚紧贴页面底部”,本文给大家分享具有实现代码,感兴趣的朋友参考下吧
    2016-03-03
  • js如何判断对象数组中是否存在某个对象

    js如何判断对象数组中是否存在某个对象

    这篇文章主要介绍了js如何判断对象数组中是否存在某个对象问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • JS获取图片lowsrc属性的方法

    JS获取图片lowsrc属性的方法

    这篇文章主要介绍了JS获取图片lowsrc属性的方法,涉及javascript操作网页图片属性的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 不想让浏览器运行javascript脚本的方法

    不想让浏览器运行javascript脚本的方法

    本篇文章给大家介绍不想让浏览器运行javascript脚本的方法,操作方法很简单,只需按照以下几步就可以完成,需要的朋友参考下
    2015-11-11

最新评论