将某个div内容保存成图片,使用html2canvas截图方法(高清图并解决图片跨域问题)

摘要:
varc_height=$('.box').outerHeight();varcanvas=document.createElement(“canvas”);canvas.height=c_height*比率;canvas.style.width=c_width+“px”;canvas.style.height=c-height+“px”;

首先附上html2canvas的CDN地址:http://www.bootcdn.cn/html2canvas/ ;

此方法可截取整个div的内容,包括不可视区域,并且可以实现跨域图片截图。之前看了很多关于html2canvas插件图片跨域的解决办法,大部分的答复是在服务器端配置,之后将useCORS属性设置为true,但是如果图片是保存在别人家的服务器上比如阿里云的oss上,那这个方法就实现不了了。哦多卡几,那就把图片转成base64编码赋给img的src,再去截图,这样截图时就避开了跨域请求。完整代码如下:

<div class="box">
  <p>
这是生成图片的box,内容不限</p> 
//跨域图片(oss地址)
  <img src="https://devimg.xiezixiansheng.com/users/0/1/photo/20160708035328.jpeg">
</div>

下面是js代码:

        var c_width = $('.box').outerWidth();//如果box设置了padding,需要获取outerWidth和outerHeight来赋给canvas;
        var c_height =$('.box').outerHeight();

        var canvas = document.createElement("canvas");
        var context = canvas.getContext("2d");

    //以下代码是获取根据屏幕分辨率,来设置canvas的宽高以获得高清图片
        // 屏幕的设备像素比
        var devicePixelRatio = window.devicePixelRatio || 2;

        // 浏览器在渲染canvas之前存储画布信息的像素比
        var backingStoreRatio = context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;

        // canvas的实际渲染倍率
        var ratio = devicePixelRatio/backingStoreRatio;

        canvas.width = c_width * ratio;
        canvas.height = c_height * ratio;
        canvas.style.width = c_width + "px";
        canvas.style.height = c_height + "px";
      
        var transTop = $(document).scrollTop() - $('.card_box').offset().top;//获取div垂直方向的位置
    
        context.scale(ratio,ratio);
        context.translate((c_width-$(window).width())/2,transTop) //canvas的位置要保证与div位置相同。
    //高清图设置完成
    
   //解决跨域,将跨域图片路径转为base64格式
    var img = new Image();
    var canvas2 = document.createElement('canvas');
    var ctx = canvas2.getContext('2d');
    img.crossOrigin = 'Anonymous';
    img.src=$('#ossImg').attr('src);
    img.onload = function () {
     canvas2.height = img.height;
     canvas2.width = img.width;
     ctx.drawImage(img, 0, 0);
     var dataURL = canvas2.toDataURL('image/png');
      
$('#ossImg').attr('src',dataURL);
        canvas2 = null;

    //重新给img赋值成功后,执行截图方法
    getCard()

    }

    function getCard(){
      html2canvas($(".box"),{
            allowTaint:true,
            useCORS:true,
            canvas:canvas,
            onrendered:function(canvas){
                dataURL =canvas.toDataURL("image/png");
                var img = new Image();
                img.src=dataURL;
                img.className = 'cardImg';
                img.onload = function () {           
                    $(".card").append(img);                

                }
            },
            c_width,
            height:c_height
        })
   } 

注意!!!如果需要生成图片的div有背景图,需要将背景图以img标签定位显示,若直接给div设置background会导致生成的图片 背景图模糊。附上亲身经验的图片(最下方的二维码及文字与底层大背景是一体):

图1是div设置background的图片效果,图2是div用img标签展示的效果:

将某个div内容保存成图片,使用html2canvas截图方法(高清图并解决图片跨域问题)第1张          将某个div内容保存成图片,使用html2canvas截图方法(高清图并解决图片跨域问题)第2张

我又来补充了:采坑过程有点艰难,最近做的活动又有这个截图的功能,活动界面比较炫酷 各种颜色各种渐变发光效果。然后截图就导致了比其他普通图片图片大很多,base64编码是会阻塞浏览器渲染的,当编码过长会造成浏览器卡顿,苹果手机影响不大,安卓机特别是华为手机上,滑动卡顿明显,且在QQ里出现闪退。所以,如果需要截的图很大的话,还是建议与服务器端配合。

免责声明:文章转载自《将某个div内容保存成图片,使用html2canvas截图方法(高清图并解决图片跨域问题)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【[Offer收割]编程练习赛13 B】最大子矩阵(自己的思路)通过PEB遍历当前进程中的模块(C语言实现)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pdf.js 前端pdf预览 渲染文本图层支持复制 保证手机端清晰度 双指缩放 alloyfinger(手势)

预览地址: https://feiyefeihua.gitee.io/ 一、渲染pdf核心代码 首先安装 pdf.js 的 npm 版本: npm i pdfjs-dist@2.6.347 使用: import * as PDFJS from "pdfjs-dist"   其中,pdf.js 加载pdf文件依赖了 pdf.worker.js ,通过指定 p...

提高iOS开发效率的第三方框架等--不断更新中。。。

1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层。简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 Model 类来存放这些数据。这就要求我们编写一系列的序列化代码,来把 json 转换为 Model 。这很费时间,容易错,不容易修改。 Mantle 很好...

python——js 或Jquery操作定位元素

原文:https://www.cnblogs.com/dangkai/p/9948573.html 属性过滤常用javascript后去DOM对象 id是定位到的是单个element元素对象,其它的都是elements返回的是list对象 1.通过id获取 document.getElementById(“id”) 2.通过name获取  documen...

Excel.Application手册

----转载:http://blog.csdn.net/xxfigo/article/details/6618129 定制模块行为(1) Option Explicit '强制对模块内所有变量进行声明    Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示    Option Compare T...

使用html2canvas和jsPdf实现打印功能

最近做项目中,️遇到过实现模版打印功能,网上也找到很多资料可以实现,有的方式可以实现分页,但是打印的A4纸上下不能留边距,后来找到一个通过剪裁的方式可以实现左右上下留边距,并且能实现分页; 方法如下:基本思路是对获得的canvas进行切割,按A4纸大小并留边距后的比例进行剪裁,切出一页一页的内容来,再分别加到pdf中。 DEMO: 1 // 导出页面为...

php银联网页支付实现方法

     本文实例讲述了php银联网页支付实现方法。分享给大家供大家参考。具体分析如下: 这里介绍的银联WAP支付功能,仅限消费功能。 1. PHP代码如下: 复制代码代码如下: <?phpnamespace commonservices;class UnionPay{    /**     * 支付配置     * @var array   ...