关于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);
        }
    }
}

原文地址:https://www.cnblogs.com/teamemory/p/9767030.html

时间: 2024-10-11 03:26:39

关于h5绘制canvas生成图片的注意点!的相关文章

使用html2canvas在H5端独立生成图片

前言 流量之于互联网公司,就如同水之于万物一样重要,那么当今国内的移动互联网流量主要集中在哪里呢?答案是显而易见的,那就是我们每天都在使用的微信. 2018年年初,微信的月活用户数已经突破了10亿,成为了国内首个月活超过10亿的产品."3Q大战"之后的腾讯逐渐由封闭走向了开放,而微信作为腾讯在移动互联网时代最重要最成功的战略级产品,也在切实实践着腾讯的开放战略.在这样的大背景下,如何利用好微信内的流量,引导用户去做分享和传播,就成为摆在我们面前的重要课题.但是微信方面基于自身利益以及用

解析json结构绘制canvas

在工作中偶尔会遇到绘制转发卡/邀请卡的业务,且这个转发卡/邀请卡的风格会有很多,要求最后生成图片.这时候如果使用一张图片绘制一个canvas,这个工作量会相当大.分析一下转发邀请的内容,会发现所有的里面的元素都是一样的,只是风格不一致,所以我使用了解析json结构来绘制canvas,如果后期需要增加风格,只要增加json就可以了. demo图大概这样: 点击下方的不同风格的图片就会生成不一样的图片. 下面我们要实现代码: style样式: *{padding: 0;margin: 0;} bod

h5的canvas绘制方格

两个循环绘制 <body> <canvas id="cv" width="800" height="500"></canvas> <script> var cv = document.querySelector('#cv'); var ctx = cv.getContext('2d'); ctx.beginPath(); // 绘制水平线,起始点x坐标都为0,结束点x坐标都为宽度 // y坐标从50

H5在canvas中绘制图片时候遇到跨域问题

在前端绘制图片时需要用到其他服务器的图片,当然没有读取成功. 在网上一顿搜索,设置了图片允许跨域. img.crossOrigin = "Anonymous" 在调试中也可以看到图片,不过还是绘制失败.经过一波XXX式的试探和查找,找到一个解决方案. 在在iis中配置响应头,可能是之前获取图片的时候没有能够通过允许的类型. Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:origin,x-reques

Java绘制图片生成图片文件进行预览

Java绘制图片并实现打印前生成图片文件进行预览, 适用于开发阶段. 如果要使用界面完成预览,请另找资源.这里用这个功能主要是用于结果预览,因为如果使用打印来进行结果验证,会浪费大量的纸张. Java代码: import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;imp

H5之canvas简单入门

<canvas></canvas>是html5出现的新标签,像所有的dom对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,js能够调用它来进行绘图 <canvas id="myCanvas" width="400" height="400"></canvas>默认宽度300px,默认高度 150px; 下面是简单的语法,是必须要记住的. 绘图路径: beginPath() :开始路径 c

H5之canvas

Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表.动画等. 在使用Canvas前,用canvas.getContext来测试浏览器是否支持Canvas: <!-- HTML代码 --><canvas id="test-canvas" width="200" heigth="100"><p>你的浏览器不支持Canvas</p></canvas>

h5标签canvas关于getImageData跨域的问题

在学习h5的时候,canvas标签中getImageData()报错:security error! 具体代码如下(chrome浏览器): function createGSCanvas(img){ var canvas=document.createElement("canvas"); canvas.width=img.width; canvas.height=img.height; var ctx=canvas.getContext("2d"); ctx.dra

绘制canvas进度条

效果图: html: <div class="circle " data-d="90"> <canvas width="270" height="270" id="canvas"></canvas> </div> css: body{ background: #4EC2EA; } .circle { width: 230px; height: 230px; m