js配合html2canvas和canvas2image将dom元素转化成图片(如果对您有用点个赞吧)

最近遇到一个需求,是关于运势测试的,将用户信息保存在底部图上,在微信中长按保存信息会与图片一起被保留下来。
图示:

静态页面

image.png

保存下来的图片

image.png

我们需要用到的资源

心路历程

从完全不懂这个技术到做出来大约花了一天的时间,参考网上的资源大体完成了功能

代码

<!DOCTYPE html>
<html>
<head>
    <title>运势结果</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" type="text/css" href="css/result.css">
    <style type="text/css">
        #view{
            width:100%;
            height:100%;
            background-size:100% 100%;
            z-index: 99;
            /*position: relative;*/
            position: fixed;
            top: 0;
            left: 0;
            /*right: 0;
            bottom: 0;*/
            display: flex;
        }
        #thecanvas{
            position: absolute;
            top: 0;
            left: 0;
            z-index: 1;
            opacity:0;
        }
        #finalImg{
            position: absolute;
            top: 0;
            left: 0;
            z-index: 500;
            opacity: 0;
            display: flex;
            width: 100%;
        }
        #content{
            /*position: relative;*/
        }
        .content-button {
            z-index: 501
        }
        .shu{
            z-index: 101
        }
        .share-text{
            z-index: 101
        }
        .lottory{
            z-index: 101
        }
        .imgSrc{
            position: absolute;top: 0;
            z-index: 1000;
        }
    </style>
</head>
<body>
    <div id="content">
        <div id="view">
            <img src="img/result0.png" style="width: 100%;height: 100%" class="bc">
            <div class="user">
                2019年 <span>&nbsp;用户名&nbsp;</span> 您的
            </div>
        </div>
        <!-- <div class="imgSrc"></div> -->
        <!--分享、保存  -->
        <div class="share">
            <img src="img/share3.png">
        </div>
        <div class="content-button"></div>
        <!-- <div class="share-text"></div> -->
    </div>
    <div class="lottory"> 
          <img src="img/start.png" style="width: 100%;z-index: 99" >
    </div>


    <!-- 真正的抽奖点击处 -->
    <div class="real-lottory" style="z-index:501"></div>
    



    <div class="result-mask">
        <img src="img/share.png" style="width: 100%">
    </div>
    <img src="" id="finalImg">
</body>

<script src="js/jquery-2.1.4.js"></script>
<script src="js/base64.js"></script>
<script src="js/canvas2image.js"></script>
<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>
<script type="text/javascript">

    var height = $("#view").height() || 650;
    var width = $("#view").width();
    console.log(height,width)
    var scale = 2;
    function changeBg(callback){
        var random = parseInt(Math.random()*5,10);
        var sex = sessionStorage.getItem("sex");
        $(".share img").attr("src","img/share"+ random + ".png")

        console.log(random,sex)
        if(random == 2){
            if(sex == 1){
                random = 5
            }
        }
        $(".bc").attr("src","img/result"+ random + ".png")
        callback()
    }

    $(".content-button").click(function(){
        $(".result-mask").show();
    })
    $(".result-mask").click(function(){
        $(".result-mask").hide();
    })

function takeScreenshot(callback) {
    var canvas = document.createElement("canvas")
    canvas.setAttribute('id','thecanvas');
    canvas.width = width * 2;
    canvas.height = height * 2;
    canvas.style.width = width + "px";
    canvas.style.height = height + "px";
    var context = canvas.getContext("2d");
    context.scale(2,2);

    console.log('test');
    html2canvas(document.getElementById('view'), {
        canvas:canvas,
        onrendered: function(canvas) {
            document.body.appendChild(canvas);
            callback()
        },
    });
    // console.log("a完成")
}
$(".real-lottory").click(function(){
    console.log("抽奖")
})
$(".save").click(function(e){ 
   setTimeout(canvastoImg(document.getElementsByTagName("canvas")[0],'finalImg'),2000)
})

function canvastoImg(canvas,id){
  // console.log(canvas,"b开始")
 
    var image = new Image();
    image.src = canvas.toDataURL("image/png");
    $("#" + id).attr('src',image.src)
    $(".imgSrc").text(image.src)
    return image;
  
}

$(function(){
    changeBg(function(){
        setTimeout(takeScreenshot(function(){
            canvastoImg(document.getElementsByTagName("canvas")[0],'finalImg')
            
          }),2000)
        
    })
    

})

</script>
</html>

如果你要使用

把动态生成的canvas和最后生成的img的opcity都设为0,绝对定位到顶端,把canvas的index设置为-1,img高于dom的index,如页面中的 style ---> #thecanvas,#finalImg

注意

  • 如果你发现你本地的图片无法动态生成到canvas中,你需要把这些图片资源放到服务器中,最好不要跨域(我同事测试说不启动服务也可以,我没有测过,有兴趣可以试试)
  • 发现有时候定位也会导致canvas的生成没有图片只有文字,我把定位改成fixed就能正常出现图(后来发现问题原因:可能是因为图片没有加载出来,用户名信息是absolute定位上去,图片加载慢会导致var height = $("#view").height() = 0,canvas就没有高度,最后导致不能生成要保存的图片啦)
  • 想法:可以看图片长宽比与手机窗口长宽比,计算出canvas需要的高度

git

https://github.com/gyn894654492/js-html2canvas-canvas2image-dom-

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容