• 关于h5绘制canvas生成图片的注意点!


    1、第一个是关于移动端自适应的问题:

    答:如果是最后只要一张canvas生成的图片,而不是要绘制的canvas的图形,则不需要考虑自适应,绘制canvas的时候的宽高,可以直接写成UI提供的图的大小,比如UI提供的图是 750 * 1280 ,则绘制canvas的时候,所有的数据都可以

    以375*640来进行计算,固定好即可!这个跟后台绘制图片的原理一样,我们不需要考虑自适应,ui给什么图,或者说我们希望要多大的图片,我们直接绘制即可,因为图片最后自己可以按比例伸缩,默认即是自适应! 

    2、关于H5绘制canvas的多行文本,我们可以利用测量宽度进行自动换行绘制文字!

    3、绘制图片完成后再绘制文字,即可解决文字在图片底部的问题!

    具体代码如下:

    /**
     * 绘制canvas
     */
    function draw(name='大威德', score = 23, level = 1, str = '哈哈哈哈') {
        var c = document.getElementById("canvas");
        var ctx = c.getContext("2d");
        // 绘制背景
        var img = new Image();
        img.src = "images/newbg.jpg";
        img.onload = function () {
            ctx.drawImage(img, 0, 0,375,640);
            // 绘制底部文字
            ctx.font = "bold normal 20px Microsoft YaHei";
            ctx.fillStyle = "black";
            ctx.fillText(name, 375 * 0.18, 640 * 0.34);
            ctx.font = "bold normal 20px Microsoft YaHei";
            ctx.fillStyle = "red";
            ctx.fillText(score, 375 * 0.63, 640 * 0.345);
            ctx.fillStyle = "black";
            ctx.fillText(level, 375 * 0.37, 640 * 0.458);
            ctx.font = "normal 18px Microsoft YaHei";
            ctx.fillStyle = "black";
            // 绘制多行文字
            canvasTextAutoLine(str, c, 375 * 0.1, 640 * 0.5, 20);
         var imgsrc = c.toDataURL("image/png",1);
       注意:这一行就是把canvas绘制的图形变成图片,imgsrc为base64格式!
        };
    
    }
    /*
    str:要绘制的字符串
    canvas:canvas对象
    initX:绘制字符串起始x坐标
    initY:绘制字符串起始y坐标
    lineHeight:字行高,自己定义个值即可
    */
    function canvasTextAutoLine(str, canvas, initX, initY, lineHeight) {
        var ctx = canvas.getContext("2d");
        var lineWidth = 0;
        var canvasWidth = document.documentElement.clientWidth;
        var lastSubStrIndex = 0;
        for (let i = 0; i < str.length; i++) {
            lineWidth += ctx.measureText(str[i]).width;
            if (lineWidth > canvasWidth * 0.8) {//减去initX,防止边界出现的问题
                ctx.fillText(str.substring(lastSubStrIndex, i), initX, initY);
                initY += lineHeight;
                lineWidth = 0;
                lastSubStrIndex = i;
            }
            if (i == str.length - 1) {
                ctx.fillText(str.substring(lastSubStrIndex, i + 1), initX, initY);
            }
        }
    }
  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体&lt; &gt: &amp;等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/teamemory/p/9767030.html
Copyright © 2020-2023  润新知