移动端canvas合成图片,填充文字自动换行

今天用canvas合成带有微信公众号二维码和祝福语的春节贺卡
这里写图片描述
由于代码都是原生的没有引入其他库,所以直接将对应部分贴出来吧。

html

<!--画布 -->
<canvas id="canvas" class="hide">
    Your browser does not support the HTML5 canvas tag.
</canvas>
<!--背景图-->
<img id="page2_bg" src="images/greeting_card1.jpg" class="hide"/>
<!--二维码-->
<img id="test1" class="hide" src="images/code.png" />
<!--装图片的容器-->
<div id="new-img-div" class="hide">
    <img src="images/close.png" class="close-img"/>
    <div id="onlyoneImg"></div>
</div>

css:

.hide {
    display: none;
}

其他元素布局的样式就不贴了,毕竟没有难度

接下来看看重头戏js:

    //给canvas定宽高
    var bodyW = $('body').width()+'px';
    var bodyH = $('body').height()+'px';
    console.log('bodyW',bodyW);
    console.log('bodyH',bodyH);
    $("#canvas").attr('width','640px')
    $("#canvas").attr('height','1138px')

    //画图函数
    function writeTextOnCanvas(cns, lh, rw, text){
        var cns = document.getElementById(cns);
        var ctx = cns.getContext("2d");
        //提供canvas的数据
        var canvasW = $('#canvas').width();
        var canvasH = $('#canvas').height();
        console.log('canvasW',canvasW)
        //
        var wordsTop = canvasH*0.185;
        var wordsLeft = canvasW*0.195;
        var wordsAllWidth = canvasW*0.65;

        console.log(wordsAllWidth)
        var wordsNumOnline = parseInt(wordsAllWidth/12)
        var img1=document.getElementById("page2_bg");
        var img2= document.getElementById("test1");
        //var img111 = img1.attr('src');
        console.log(img1);

        //画背景
        ctx.drawImage(img1,0,0,canvasW,canvasH);
        //画二维码
        ctx.drawImage(img2,428,884,171,172);

        //处理文字
        var lineheight = lh;
        var text = text;
        ctx.width = cns.width;
        ctx.height = cns.height;
        //字体大小必须和字体类型一起设置
        ctx.font="24px Helvetica";
        //字体颜色
        ctx.fillStyle = '#f6dda0';
        function getTrueLength(str){//获取字符串的真实长度(字节长度)
            var len = str.length, truelen = 0;
            for(var x = 0; x < len; x++){
                if(str.charCodeAt(x) > 128){
                    truelen += 2;
                }else{
                    truelen += 1;
                }
            }
            return truelen;
        }
        function cutString(str, leng){//按字节长度截取字符串,返回substr截取位置
            var len = str.length, tlen = len, nlen = 0;
            for(var x = 0; x < len; x++){
                if(str.charCodeAt(x) > 128){
                    console.log('汉字')
                    if(nlen + 2 < leng){
                        nlen += 2;
                    }else{
                        tlen = x;
                        break;
                    }
                }else{
                    console.log('字符')
                    if(nlen + 1 < leng){
                        nlen += 1;
                    }else{
                        tlen = x;
                        break;
                    }
                }
            }
            return tlen;
        }
        for(var i = 1; getTrueLength(text) > 0; i++){//分行
            var tl = cutString(text, wordsNumOnline);
            ctx.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), wordsLeft, i * lineheight + wordsTop);
            text = text.substr(tl);
        }

        //转化成图片
        var flagImg = document.createElement("img");
        flagImg.src = cns.toDataURL("image/png");

        $("#onlyoneImg").append(flagImg);
        $('#canvas').addClass('hide');
    }
writeTextOnCanvas("canvas", 32, 40, '祝你新年快乐,万事如意');

有一点需要注意的:

flagImg.src = cns.toDataURL("image/png");

这里的转化会出现跨域问题,所以合成的图片来源必须要是同源。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值