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

如何使用HTML实现截图功能

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

如何使用HTML实现截图功能

这篇文章主要介绍了如何使用HTML实现截图功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

最近项目需求总是有HTML页面生成图片功能,所以就想记录一下自己在过程中遇到的问题,并加深印象,日后如果忘了也可以回顾。我们项目使用的是html2canvas插件,还有其他插件,例如dom-to-image、rasterizehtml,可以根据需求使用。

html2canvas使用问题汇总

项目中引入的是0.5.0-beta4版本的cdn链接,直接调用方法html2canvas(dom,options);第一个参数是你要绘制的dom对象,第二个参数是一些绘制的配置参数,个别参数我尝试了也没搞清楚具体什么作用可以自行看html2canvas文档,对于我用到的直接上代码:

// 生成图片
        function generateImg() {
            var shareContent = document.body;// 需要绘制的部分的 (原生)dom 对象 ,注意容器的宽度不要使用百分比,使用固定宽度,避免缩放问题
            var width = shareContent.offsetWidth;  // 获取(原生)dom 宽度
            var height = shareContent.offsetHeight;
            var offsetTop = shareContent.offsetTop;  //元素距离顶部的偏移量
            // var rect = shareContent.getBoundingClientRect();
            var canvas = document.createElement('canvas');  //创建canvas 对象
            var context = canvas.getContext('2d');
            var scaleBy = 3;  //像素密度 (也可以采用自定义缩放比例)
            canvas.width = width * scaleBy;   //这里 由于绘制的dom 为固定宽度,居中,所以没有偏移
            canvas.height = (height + offsetTop) * scaleBy;  // 注意高度问题,由于顶部有个距离所以要加上顶部的距离,解决图像高度偏移问题
            canvas.height = height * scaleBy;
            // context.translate(0, -offsetTop); // 画布偏移
            context.scale(scaleBy, scaleBy);
            html2canvas(shareContent, {
                logging: true, // 是否打印日志,默认false
                taintTest: true, //检测每张图片都已经加载完成
                scale: scaleBy, // 添加的scale 参数
                canvas: canvas, //自定义 canvas
                width: width, //dom 原始宽度
                height: height, //dom 原始高度
                useCORS: true, //允许跨域
                onrendered: function(canvas) { // 页面绘制成功后的回调
                    var url = canvas.toDataURL("image/png");
                    // 生成图片后的操作
                }
            });
        }

图片模糊解决

  • 由于像素比(DPR = 设备像素/CSS像素)的问题,电脑上截图看着还行,到手机上就会非常模糊。绘制图片时可以根据像素比把图片放大,使用时在定义图片的宽度,也可以自定义缩放比。缩放比也不是越大越好,太大了也可能会出问题。计算像素比的代码:

function getPixelRatio(context){
        var backingStore = context.backingStorePixelRatio ||
                context.webkitBackingStorePixelRatio ||
                context.mozBackingStorePixelRatio ||
                context.msBackingStorePixelRatio ||
                context.oBackingStorePixelRatio ||
                context.backingStorePixelRatio || 1;
        return (window.devicePixelRatio || 1) / backingStore;
    }
  • 绘图时尽量不要使用背景图片,直接使用img这样会更清晰

图片跨域问题

有次页面中使用了微信头像,设置了useCORS: true不能显示头像,设置allowTaint:true直接报错不能使用toDataURL可能无法导出受污染的画布;最后只有找百度了

  • 修改Nginx配置文件,由于我们项目其他地方也用到了,所以不便修改,可以修改的参考:

location ^~ /wechat_image/ {
  add_header 'Access-Control-Allow-Origin' "$http_origin" always;
  add_header 'Access-Control-Allow-Credentials' 'true' always;
  add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
  add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
  proxy_pass http://thirdwx.qlogo.cn/;
}
  • 把图片转换成base64格式并设置CrossOrigin="anonymous",尝试后有缓存的情况下还是不能正常生成图片,需要在后面拼接一个随机参数解决缓存问题,Android可以了,但ios上还是不行。

  • 后来发现直接在微信头像的img标签上设置CrossOrigin="anonymous"即<img class="user-img" th:class="lazy" data-src="${wxUser.headImgUrl}" alt="" crossOrigin="anonymous" />,微信头像的请求头来就有access-control-allow-origin: *,Android和ios上都可以了,如果你之前尝试过其他方法,可能需要清下缓存,不然Android会误导你不能正常显示。

  • 最近又发现一个html2canvas的options里配置proxy为跨域的url。

生成图片替换页面时闪现问题

前面几次生成图片,都没有出现这个问题,最近一次出现了替换时页面一闪,以为是不是图片太大了,我将两个活动的图片保存对比并不是,具体我还是没搞清楚,不过通过先在dom中写一个空的img标签然后生成的class="lazy" data-src替换给img,判断图片加载完成后再将绘制的dom隐藏掉解决了这个问题。

css样式超出显示省略号消失

html2canvas不支持css样式生成省略号,百度找到了解决方法,通过js判断超过父盒子高度时用省略号替换

$(".info_text_box").each(function () {
            var divH = $(this).height();
            var $p = $("p", $(this)).eq(0);
            while ($p.outerHeight() > divH) {
                $p.html($p.html().replace(/(\s)*([a-zA-Z0-9]+|\W)(\.\.\.)?$/, "..."));
            };
        });

引入web字体时字体还没有显示就生成图片

window.onload=function(){}是等页面资源加载完毕再执行,但是在ios中并不支持,后来发现当字体大小大于300px时不同字体的宽度差别很大,就通过定时器判断字体大小来判断字体是否加载成功,但最总因为字体文件加载太慢,就放弃了使用特殊字体

// 通过判断字体内容宽度判断字体加载完成
function fn_fontWatch(fontFamily, cb) {
        function fn_gen_span_with_font(font) {
            var span=document.createElement('span');
            span.style.cssText = "display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:" + font;
            span.innerHTML = 'BESbswy';
            document.body.append(span);
            return span;
        };
        var span_default = fn_gen_span_with_font('serif');
        var span_default_width = span_default.offsetWidth;
        document.body.removeChild(span_default);
        var span_font = fn_gen_span_with_font(fontFamily + ',serif');
            var fn_check_loop = function() {
                if(span_default_width !== span_font.offsetWidth){
                    document.body.removeChild(span_font);
                    cb();
                } else {
                    window.setTimeout(fn_check_loop,500);
                }
            };
            fn_check_loop();
    };

其他问题

  • 一次活动需要判断进入页面次序,html2canvas是通过遍历dom绘制图片的,当生成图片时除了js都会重新执行一次,导致类似刷新页面记录次序,最后次序通过ajax请求获取解决了问题;

  • html2canvas只会截取页面中可见的内容,设置了display: nonevisibility:hidden的元素是截取不到的

  • 生成图片时文字有些许变化,比如安卓的数字1就变化特别明显,而且文字的位置有点下移,原因我没找到,影响不大,目前我也没解决;

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用HTML实现截图功能”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

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

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

如何使用HTML实现截图功能

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

下载Word文档

猜你喜欢

如何使用Vue实现拖动截图功能

这篇文章主要介绍了如何使用Vue实现拖动截图功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Vue实现拖动截图功能文章都会有所收获,下面我们一起来看看吧。一、安装html2canvas、vue-cro
2023-07-04

如何使用jQuery插件imgAreaSelect实现截图功能

这篇文章主要介绍了如何使用jQuery插件imgAreaSelect实现截图功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用jQuery插件imgAreaSelect实现截图功能文章都会有所收获,下面
2023-07-04

html中如何实现截取图片功能(两种方法)

随着互联网的不断发展,图片已经成为网页设计中不可缺少的重要元素之一。在HTML中,我们可以通过各种技巧来展示和截取图片,使网页更加美观和有吸引力。本文将介绍HTML的图片截取技术,以帮助读者更好地掌握这一技能。一、HTML图片基础知识在HTML中,我们常常使用<img>标签来展示图片。下面是一段HTML代码,展示了一张图片:```<img src="example.jpg" a
2023-05-14

html中怎么实现截取图片功能

这篇文章主要介绍了html中怎么实现截取图片功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇html中怎么实现截取图片功能文章都会有所收获,下面我们一起来看看吧。一、HTML图片基础知识在HTML中,我们常常
2023-07-05

怎么使用Vue+canvas实现视频截图功能

这篇“怎么使用Vue+canvas实现视频截图功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Vue+canvas
2023-07-02

VBS怎么实现截图功能

本篇内容主要讲解“VBS怎么实现截图功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VBS怎么实现截图功能”吧!以下代码:VBS截屏.vbs Win7x64 测试通过(已安装Word2007)
2023-06-08

Android实现拍照截图功能

本文将向大家展示如何拍照截图。 先看看效果图:拍照截图有点儿特殊,要知道,现在的Android智能手机的摄像头都是几百万的像素,拍出来的图片都是非常大的。因此,我们不能像对待相册截图一样使用Bitmap小图,无论大图小图都统一使用Uri进行
2022-06-06

golang怎么实现截图功能

这篇文章主要介绍“golang怎么实现截图功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang怎么实现截图功能”文章能帮助大家解决问题。在Golang中,实现截图功能主要分为以下几个步骤:
2023-07-06

使用Android实现截图和分享功能的案例

这篇文章主要介绍了使用Android实现截图和分享功能的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先给大家展示下效果图吧直接上代码:xml的布局:
2023-05-30

在linux (centos)上使用puppeteer实现网页截图功能

你在linux上安装puppeteer时可能遇到如下问题,本文将引导你如何爬坑!> puppeteer@2.0.0 install /www/node_modules/puppeteer > node install.js ERROR: F
2022-06-04

怎么使用PHP实现网页自动截图功能

今天小编给大家分享一下怎么使用PHP实现网页自动截图功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、准备工作要实现网页
2023-07-05

vue项目中怎么使用canvas实现截图功能

本文小编为大家详细介绍“vue项目中怎么使用canvas实现截图功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中怎么使用canvas实现截图功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现效
2023-07-02

Android中怎么实现截图功能

Android中怎么实现截图功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 截图功能源码的分析一般没有修改rom的android原生系统截图功能的组合键是音量
2023-05-30

OpenCV如何使用GrabCut实现抠图功能

这篇文章主要介绍“OpenCV如何使用GrabCut实现抠图功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“OpenCV如何使用GrabCut实现抠图功能”文章能帮助大家解决问题。1、概述案例:使
2023-07-05

arcgis使用Python脚本进行批量截图功能实现

最近公司数据部那边有个需求,需要结合矢量数据和影像数据,进行批量截图,并且截图中只能有一个图斑,还要添加上相应的水印,这篇文章主要介绍了arcgis使用Python脚本进行批量截图,需要的朋友可以参考下
2023-01-15

编程热搜

目录