html2canvas.js实现前端将页面转化为图片并长按下载

1.需求

由于在最近在做的项目需要用到在前端把页面生成图片并保存到手机中,在技术调用过程中自己写了一个demo,没有采用vue-cli脚手架,但是大同小异,这个demo也采用了vue2.js开发页面,qrcode.js来生成二维码,原理比较简单。该demo项目:github地址 ,觉得有帮助的给一个星,万分感谢。该项目不能直接打开index.html进行访问,会出现报错。请用 http-server 打开,不明白怎么配置可参考http-server开启本地服务

在线预览

具体的需求如下:
  1. 获取后台信息,得出排名和用户图像
  2. 点击保存按钮,把改页面生成图片
  3. 长按保存图片或扫描二维码

2.思路

  1. html2canvas.js:可将 htmldom 转为 canvas 元素。
  2. canvasAPI:toDataUrl() 可将 canvas 转为 base64 格式
  3. 在微信浏览器中,长按img,会弹起actionsheet,可以进行保存、发送、识别二维码等操作

3.代码分析

解决图片模糊

在pc端开发时生成图片没有问题,但是在移动端会出现模糊的情况,主要原因是像素比的问题。

设备像素比 (简称 dpr) 定义了物理像素和设备独立像素的对应关系,它的值可以按如下的公式的得到: 设备像素比 = 物理像素 / 设备独立像素 // 在某一方向上,x方向或者y方向

解决代码:

 /**
         * 根据 window.devicePixelRatio 获取像素比
         * @returns {number}
         */
        changeDpr: function() {
            if (window.devicePixelRatio && window.devicePixelRatio > 1) {
                return window.devicePixelRatio;
            }
            return 1;
        },
复制代码

####解决图片不显示问题 如果引用没有跨域配置的图片地址会出现一下报错

 Uncaught (in promise) DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
复制代码

尽管不通过 CORS 就可以在画布中使用图片,但是这会污染画布。一旦画布被污染,你就无法读取其数据。例如,你不能再使用画布的 toBlob(), toDataURL() 或 getImageData() 方法,调用它们会抛出安全错误。 HTML 规范中图片有一个 [crossorigin](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img#attr-crossorigin) 属性,结合合适的 CORS 响应头,就可以实现在画布中使用跨域 <img> 元素的图像。

解决代码如下:

     // 将图片转为base64格式
        imgTobase64: function(url, crossOrigin) {
            return new Promise(resolve => {
                const img = new Image();

                img.onload = () => {
                    const c = document.createElement('canvas');

                    c.width = img.naturalWidth;
                    c.height = img.naturalHeight;

                    const cxt = c.getContext('2d');

                    cxt.drawImage(img, 0, 0);

                    // 得到图片的base64编码数据
                    resolve(c.toDataURL('image/png'));
                };

                // 结合合适的CORS响应头,实现在画布中使用跨域<img>元素的图像
                crossOrigin && img.setAttribute('crossOrigin', crossOrigin);
                img.src = url;
            });
        }
复制代码

####生成图片 图片生成是利用canvas来进行获取并生成图片,有些需求需要导出长图,可以改动一下代码

 // 设置需要生成的图片的大小,不限于可视区域(即可保存长图)
            var w = dom.style.width;
            var h = dom.style.height;
复制代码

由于部分需求并不需要显示个别的元素,可以利用 data-html2canvas-ignore来进行忽略。如果在开始渲染不显示,可以把它的透明度进行变化,在转化之前设置为1即可。 下载后的图片会覆盖整个页面,即长按就可以调用actionsheet进行操作。 代码如下:

        /**
         * 生成图片
         */
        createImage: function() {
            var _this = this;

            // 获取想要转换的dom节点
            // var dom = document.getElementById('app');
            var dom = _this.$refs.app;
            var box = window.getComputedStyle(dom);

            // 显示导出需要样式
            _this.$refs.scanText.style.opacity = '1'

            // dom节点计算后宽高,转为整数
            var width = parseInt(box.width, 10);
            var height = parseInt(box.height, 10);

            // 获取像素比
            var scaleBy = _this.changeDpr();

            // 创建自定义的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';

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

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

            // 设置需要生成的图片的大小,不限于可视区域(即可保存长图)
            var w = dom.style.width;
            var h = dom.style.height;

            html2canvas(dom, {
                allowTaint: true,
                width: w,
                height: h,
                useCORS: true
            }).then(function(canvas) {
                // 将canvas转换成图片渲染到页面上
                var url = canvas.toDataURL('image/png');// base64数据
                var image = new Image();
                image.src = url;
                document.getElementById('shareImg').appendChild(image);
                // 隐藏按钮
                _this.CanvasImageHide = false;
                // 给渲染后图片大小全屏
                var shareImgElem = document.getElementById('shareImg');
                shareImgElem.style.height = '100%'
            });
        }
复制代码
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: html2canvas.js是一种JavaScript库,可以将网页区域转换成图片,并且可以保存为PNG格式或者JPEG格式。其主要应用场景在于将网页上的一段内容,比如高清截图、数据统计图表等转换成图片,非常适用于一些需要截图的业务场景。 该插件的下载连结可以从GitHub主页(http://github.com/niklasvh/html2canvas)和npm网站(http://npmjs.com/package/html2canvas)获取。在下载和集成使用该插件的过程中,需要注意一些事项。 首先,需要理解该插件对于浏览器的依赖性。该插件支持Chrome、Firefox、Safari、IE9+等主流浏览器,但并不支持在移动设备上使用。同时,如果您在调用该插件时,发现出现了某些问题,可以尝试更新浏览器版本或者是查看该插件在GitHub上的issue列表,看是否有其他用户已经遇到并解决了该问题。 其次,下载并引入该插件后,需要了解该插件的使用方法和相关API。该插件有许多自定义参数,比如截图的格式、生成的图片的质量、是否忽略某些元素等等。在使用该插件时,应该按需求进行参数配置,提高截图效果和生成图片的性能。 最后,在使用该插件过程中,需要注意对用户隐私的保护。如果您使用该插件进行截屏操作,应该明确告知用户您需要对其网页进行截屏,避免违反用户隐私的规定。同时,为了防止截屏操作被滥用,建议配置相关权限,避免插件被恶意利用。 ### 回答2: html2canvas.js是一个JavaScript库,用来将网页中的元素转换成canvas图像。这个库能够生成高质量、可编辑的canvas图像,这对于网站设计师和开发者来说是非常有用的。html2canvas.js库非常易用,代码精简,同时支持各种浏览器和操作系统。 html2canvas.js库的下载非常方便,可以从Github官网或者其他源代码库中下载下载下来的文件是一个JavaScript库文件,可以被集成到任何网站中。该库只需要与html和JavaScript代码一起使用,就能够将网页元素快速转换成canvas图像。 html2canvas.js库的使用方法非常简单,只需要在JavaScript代码中引入库,并调用相关函数即可。在转换时,可以指定需要转换的dom元素,也可以只转换某个区域内的元素。同时,该库还支持设置转换后的图像大小、背景色、文本字体、压缩质量等选项。 作为一款专门用来生成canvas图像的JavaScript库,html2canvas.js的应用领域非常广泛。它可以被用于网站截图、图片生成、数据可视化、广告渲染等。同时,该库还可以用来实现网站图片压缩和生成缩略图等功能。 总之,html2canvas.js是一个功能强大、易用性高的JavaScript库,它为网站设计师和开发者提供了非常有用的工具,能够让网站更加具有创意和互动性。如果你正在进行网站开发或者设计,那么html2canvas.js是一个不可错过的库。 ### 回答3: HTML2Canvas是一个JavaScript库,它允许在客户端端将HTML文档渲染成canvas。如果您想在应用程序中捕捉网页内容并将其导出为图像格式,这个库非常有用。HTML2Canvas可以捕捉DOM中的任何可见元素(包括位于窗口之外的部分)、图像、文字和样式,并生成类似于截图的图像。 要下载HTML2Canvas,第一步是到github上找到它的源代码。地址为https://github.com/niklasvh/html2canvas。这里您可以访问该项目的文档,并按照说明安装它。该项目提供了完整的JavaScript库,可以从页面下载或使用npm等包管理器下载。在下载源代码后,在HTML文件中引用HTML2Canvas库文件,做到如下: ``` <script src = "/path/to/html2canvas.min.js"></script> ``` 接下来,就可以使用HTML2Canvas提供的API将DOM元素渲染成canvas对象。一旦捕捉了可见的DOM元素,您可以导出图像到PNG、JPEG和其他流行格式中。 HTML2Canvas库还允许您设置导出图像的大小、缩放比例和其他属性。 HTML2Canvas是一个强大的工具,可以方便地在您的应用程序或网站中实现截图功能。无论您是开发一个图像编辑应用程序,还是需要捕捉用户范例,HTML2Canvas库都是值得研究的一款工具。使用HTML2Canvas将DOM元素转换为可编辑的图像,您可以将任何网页内容转换为易于编辑和共享的格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值