zoukankan      html  css  js  c++  java
  • 使用canvas截图网页为图片并解决跨域空白以及模糊问题

    前几天给了个需求对浏览器网页进行截图,把网页统计数据图形表等截图保存至用户本地。

    首先对于网页截图,我用的是canvas实现,获取你需要截图的模块的div,从而使用canvas对你需要的模块进行截图。

    我们先来引入canvas的js文件,js文件获取地址官网主页:http://html2canvas.hertzen.com/

    <script type="text/javascript" src="js/html2canvas.js"></script>
    <script type="text/javascript" src="js/html2canvas.min.js"></script>

    div按钮代码

    <div><a id="down" href="" download="downImg">下载按钮</a></div>
    //href用来取到值 要写个空   down load是下载图片出来的名称

    jsp代码

    
    
    function test() {
         var canvas2 = document.createElement("canvas");
        //创建一个新的canvas let _canvas = document.querySelector('#dijit__TemplatedMixin_0');     
         //这里面填写 你需要截图的div var w = parseInt(window.getComputedStyle(_canvas).width);   var h = parseInt(window.getComputedStyle(_canvas).height); canvas2.width = w * 2; canvas2.height = h * 2;            
         //将canvas画布放大2倍或者更多,然后盛放在较小的容器内,就显得不模糊了 canvas2.style.width = w + "px"; canvas2.style.height = h + "px"; var context = canvas2.getContext("2d"); context.scale(2, 2);  //指图片偏移 html2canvas(document.querySelector('#dijit__TemplatedMixin_0'), { //写需要截图的div taintTest : false, useCORS : true, allowTaint :false,   //这三串代码解决跨域问题
        canvas : canvas2 }).then(function(canvas) {  document.querySelector("#down").setAttribute('href',canvas.toDataURL());   
                //down设置为你的点击键 单机下载 });
    window.onload = test;  
     

    记得div要选对,不然会出现下载出来htm文件和txt文件。

    截图出来后,由于我的网址上有百度地图的api,地图图片等等一些东西,用canvas网页进行截图是就会发现所有图片的地方都是空白。这就是因为跨域。

    来讲一下跨域问题,我举个例子说明这个跨域,比如我的网页里面有的图片不是来自于自己的服务器。那么,这张图片就和这个网页不是同域,那么html2canvas就无法对这种图片进行截图,如果你的网站的所有图片都放在单独的图片服务器上,那么用html2canvas对整个网页进行截图是就会发现所有图片的地方都是空白。

    跨域问题网上好多大佬说用代理服务器来解决,但是感觉太麻烦,后来我使用了小段代码就OK了。

    taintTest : false,     
    useCORS : true,            
    allowTaint :false, 
    //注:useCORS:true和allowTaint:true 这两个都是来解决跨域问题的,但是并不可以一起使用,如果同时使用会出现错误。

    对于截图模糊就调整canvas画布大小比如我上面写的*2,画布调大,容器小,截图自然就清楚了

    截图成功呈现

     
     
      未经本人同意,请勿转载!
  • 相关阅读:
    <COM原理和应用>第七章的ITextObject代码是什么?
    CString转换成char*
    COM的永久接口
    复合文档实现结构化存储的一些限制
    COM结构化存储中存储对象或者流对象的命名规则
    VS2008:Failed to return new Code Element
    MFC COM调用时出现E_OUTOFMEMORY错误
    红米NOTE应用闪退(包括系统设置等各种界面)问题解决经历
    C++中用完需要释放掉内存的几个类
    QT For Android 运行的时候找不到手机怎么办?
  • 原文地址:https://www.cnblogs.com/bubububu/p/9951185.html
Copyright © 2011-2022 走看看