我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS如何实现页面截屏功能实例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS如何实现页面截屏功能实例代码

"页面截屏"是前端经常遇到的需求,比如页面生成海报,弹窗图片分享等,因为浏览器没有原生的截图API,所以需要借助canvas来实现导出图片实现需求。

可行性方案

  1. 方案1: 将 DOM 改写成 canvas ,调用canvas的toBlob或者toDataURL方法即刻上传到七牛云或服务器
  2. 方案2: 使用第三方库html2canvas.js实现 canvas , 在不更改页面已有DOM的情况下优雅生产canvas

解决方案的选择

方案1:需要手动计算每个DOM元素的Computed Style,然后需要计算好元素在canvas的大小位置等属性。

方案1难点

  • 需要弃用已有的html页面,改用canvas重写。
  • 页面结构层复杂的情况下用canvas写,不易重构。
  • 有一定canvas基础。

方案2:该项目在Github上stars已有两万多start,作者仍在积极维护。API非常简单,在已有项目中开箱即用。

html2canvas

因为是常见的需求,所以社区会有成熟的解决方案,首先试试社区的解决方案。


<div id="capture" style="padding: 10px; background: #f5da55">
    <h4 style="color: #000; ">Hello world!</h4>
</div>

html2canvas(document.querySelector("#capture")).then(canvas => {
    document.body.appendChild(canvas)
});

以上是官网的实例用法。在网页上出现了一个新的 canvas DOM。接下来我们只需要把canvas转换成图片就好。这里使用canva原生的toDataURL和toBlob方法上次到七牛云。

使用时需要注意。此处如果生产的画布中有跨域图片,需要配置allowTaint为true。

如果是原生canvas实现,canvas需要所有跨域图片请求完成才可绘制。有两种解决方案

  • 方案1:在html上写好img标签,class="lazy" data-src写好对应的图片url。缺点很明显,会污染页面的布局结构。
  • 方案2:使用js,使用new Image()的方式。设置class="lazy" data-src到对应的图片url,在onload回调中处理相关操作。优点:可行性最高,不过有回调地狱的问题。我们用Promise改写一下

function asyncImage(url) {
    const img = new Image();
    img.class="lazy" data-src = url;
    img.setAttribute('crossOrigin', 'anonymous');
    return new Promise((resolve, reject) => {
        img.onload = () => resolve(img);
        img.onerror = reject;
    });
}

好的,大功告成~是不是可以交付需求了呢?开开心心提测,但是在移动端测试的时候发现生产的图片非常模糊。这样是不行的,明显low了许多(测试不给过orz)。

github有相应的解决方案 传送门 ,这个回答也是解决很多人的问题

基本原理:将canvas宽高放大两倍。把css把canvas的style设置成1倍大小。


    var shareContent = YourTargetElem; 
    var width = shareContent.offsetWidth; 
    var height = shareContent.offsetHeight; 
    var canvas = document.createElement("canvas"); 
    var scale = 2 || window.devicePixelRatio ; //也可以使用设备像素比

    canvas.width = width * scale; 
    canvas.height = height * scale; 
    canvas.getContext("2d").scale(scale, scale); 

    var opts = {
        scale: scale, 
        canvas: canvas, 
        logging: true, 
        width: width, 
        height: height 
    };
    html2canvas(shareContent, opts).then(function (canvas) {
        var context = canvas.getContext('2d');

        var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height);

        document.body.appendChild(img);
        $(img).css({
            "width": canvas.width / 2 + "px",
            "height": canvas.height / 2 + "px",
        })
    });

原理我们已经知道了,实际操作之后图像也确实清晰了很多。但是问题还是没有解决掉。

缩小虽然提高了清晰度,但是我们需要的图片是原始比例的大小。。

最终多次尝试无果后,选择放弃使用框架。直接用原生canvas撸一个!

canvas绘制

我们知道,在高清屏的设备下,任何绘制canvas中的图像、文字、线条、形状都可能会出现模糊的问题。可通过引入 GitHub 中的 hidpi-canvas 有效地解决。

  1. 首先去 GitHub 下载 hidpi-canvas.js 文件:传送门;
  2. 在项目中引入 hidpi-canvas.js 文件;
  3. 调用 getPixelRatio() 函数,得到 ratio 值;
  4. 在 drawImage() 中,将 width 和 height 乘以 ratio;
  5. 最终的canvas导出为Blog,转换成文件对象上传七牛云。

核心代码如下


    function asyncImage(url) {
        const img = new Image();
        img.class="lazy" data-src = url;
        img.setAttribute('crossOrigin', 'anonymous');
        return new Promise((resolve, reject) => {
            img.onload = () => resolve(img);
            img.onerror = reject;
        });
    }
    async function drawCanvas(){
        var canvas = document.querySelector('canvas');
        var context = canvas.getContext('2d');
        var ratio = getPixelRatio(context);  // 关键代码
        canvas.width = 300 * ratio; // 画布宽度
        canvas.height = 300 * ratio; // 画布高度
        var divWidth = 300 * ratio; // 用于内容居中
        var divHeight = 300 * ratio; // 用于内容居中
        const image = await asyncImage('picUrl')
        const imgWidth = 550
        const imgHeight = 300
        context.drawImage(this, 50, 50, imgWidth * ratio, imgHeight * ratio)
        // Some other code
        const Blob = canvas.toBlob((Blob)=>{
            //上传七牛云
        });
    } 

最终生成的图片终于清晰了...只需要根据dom的offsetWidth等适配不同屏幕就可以了。

总结

如果对图片的清晰度要求不高,或者图片需求是生成缩略图的情况下。采用 html2canvas 是非常不错的选择。
否则,还是用canvas绘制出的图片更清晰。

到此这篇关于JS如何实现页面截屏功能的文章就介绍到这了,更多相关JS页面截屏功能内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS如何实现页面截屏功能实例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android截屏功能实现代码

android开发中通过View的getDrawingCache方法可以达到截屏的目的,只是缺少状态栏! 原始界面截屏得到的图片代码实现 1. 添加权限(AndroidManifest.xml文件里)代码如下:
2022-06-06

PHP代码示例:实现页面跳转功能

在PHP中,我们可以使用header()函数来实现页面跳转功能。下面是一个简单的示例:
PHP代码示例:实现页面跳转功能
2024-03-07

Python实现录屏功能的示例代码

这篇文章主要为大家详细介绍了如何利用Python实现录屏功能,文中的示例代码讲解详细,对我们掌握Python开发有一定的帮助,需要的可以参考一下
2023-03-24

js如何实现点击导航栏切换页面功能

可以使用 JavaScript 来实现点击导航栏切换页面的功能。下面是一个简单的示例:首先,在 HTML 中创建导航栏和对应的页面内容区域:```htmlHomeAboutContactHome Page
2023-08-08

如何分析C++实现功能齐全的屏幕截图示例

如何分析C++实现功能齐全的屏幕截图示例,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。屏幕截图已经成为了所有IM即时通讯软件的必备模块,也是日常办公中使用最频繁
2023-06-25

如何实现amazeui页面校验功能

这篇文章主要介绍了如何实现amazeui页面校验功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下图所示: 邮政“邮政编码”字段,数据库中是varchar2(10)。但是
2023-06-09

JS如何实现图片验证码功能

本篇内容主要讲解“JS如何实现图片验证码功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS如何实现图片验证码功能”吧!1. html代码<%@ page language="java" co
2023-06-30

Android中实现基本的短信拦截功能的代码示例

要点 1.在Manifest.xml里加"接收"SMS的权限2.在Manife
2022-06-06

Vue3 实现网页背景水印功能的示例代码

这篇文章主要介绍了Vue3 实现网页背景水印功能,这里水印的字体大小、颜色和排布参考了企业微信的背景水印,使得看起来不那么突兀,需要的朋友可以参考下
2022-11-13

vue实现tagsview多页签导航功能的示例代码

这篇文章主要介绍了vue实现tagsview多页签导航功能,本文梳理了一下vue-element-admin项目实现多页签功能的整体步骤,需要的朋友可以参考下
2022-11-13

编程热搜

目录