学习笔记-HTML截图

栏目: Html5 · 发布时间: 5年前

内容简介:最近项目需求总是有HTML页面生成图片功能,所以就想记录一下自己在过程中遇到的问题,并加深印象,日后如果忘了也可以回顾。我们项目使用的是html2canvas插件,还有其他插件,例如dom-to-image、rasterizehtml,可以根据需求使用。项目中引入的是0.5.0-beta4版本的cdn链接,直接调用方法html2canvas(dom,options);第一个参数是你要绘制的dom对象,第二个参数是一些绘制的配置参数,个别参数我尝试了也没搞清楚具体什么作用可以自行看html2canvas文档,

最近项目需求总是有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/;
}
复制代码
<img class="user-img" th:src="${wxUser.headImgUrl}" alt="" crossOrigin="anonymous" />

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

前面几次生成图片,都没有出现这个问题,最近一次出现了替换时页面一闪,以为是不是图片太大了,我将两个活动的图片保存对比并不是,具体我还是没搞清楚,不过通过先在dom中写一个空的img标签然后生成的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();
    };
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Remote

Remote

Jason Fried、David Heinemeier Hansson / Crown Business / 2013-10-29 / CAD 26.95

The “work from home” phenomenon is thoroughly explored in this illuminating new book from bestselling 37signals founders Fried and Hansson, who point to the surging trend of employees working from hom......一起来看看 《Remote》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具