canvas画图(文字换行,图片)

2020-05-26  本文已影响0人  紫灬楓

图片

layer数据.png
//config为返回画布数据
config = {top: -350,
left: 0,
zoom: 0.6,
width: 1920,
height: 1080,
programName: "测",
programId: "2139",
opacity: 1,
backgroundColor: "#4a4a4a" }
//layer数据看上图

let canvas = document.createElement("canvas");
canvas.width = config.width * zoom;
canvas.height = config.height * zoom;
let ctx = canvas.getContext("2d");
ctx.fillStyle = config.backgroundColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);

function drawImageOnCanvas(ctx, config, layer) {
    var resource = layer.content[0];
    return new Promise((resolve, reject) => {
        let { x, y } = layer.style;
        var img = document.createElement("img");
     //图片跨域(若仍跨域请在阿里云后台设置跨域为*)
        img.setAttribute('crossOrigin', 'Anonymous');
        img.onload = () => {
            var style = getImageStyle(layer.style, { width:resource.widthDpi, height:resource.heightDpi });
            ctx.drawImage(img, 0, 0, img.width, img.height, (x + style.x) * zoom, (y + style.y) * zoom, style.width * zoom, style.height * zoom);
            resolve();
        }
        img.onerror = (err) => {
            console.log(err);
            resolve();
        }
        img.src = resource.imgCover;
    });
}

调用

if (layer.content.length > 0) {
      drawImageOnCanvas(ctx, config, layer, layer.content[0].imgCover)
      .then(next)
      .catch(reject)
    } else {
       next()
    }

文字(可换行)

function drawTextOnCanvas(ctx, config, layer, src) {
    return new Promise((resolve, reject) => {
        let { x, y, width, height, textAlign, backgroundColor, 
                color, fontSize, fontStyle, fontHeight,
                fontFamily, textDecoration} = layer.style;
        // 设置背景颜色
        ctx.fillStyle = backgroundColor;
        ctx.fillRect(x * zoom, y * zoom, width * zoom, height * zoom);
        // 设置字体
        ctx.fillStyle = color;
        ctx.font = `${parseInt(fontSize) * zoom}px ${textDecoration} ${fontFamily} ${fontStyle} ${fontHeight}`;
        // 设置水平对齐方式
        ctx.textAlign = textAlign;
        // 设置垂直对齐方式
        ctx.textBaseline = "middle";
        // 绘制的文字(参数:要写的字,x坐标,y坐标)
        var str = src.sourceName;
        var lineWidth = 0;
         //这里是系数,要自己算
        var currentTop = y + parseInt(fontSize) * 1.3;
        var lastIndex = 0; //每次开始截取的字符串的索引 

        for (let i = 0; i < str.length; i++) {
            lineWidth += (ctx.measureText(str[i]).width + 0.05);
            if (lineWidth > width * zoom || str[i] === "\n") { 
                ctx.fillText(str.substring(lastIndex, i).replace("\n", ""), layer.style.x * zoom, currentTop * zoom);
                currentTop += parseInt(fontSize) * 1.3;
                lineWidth = 0;
                lastIndex = i;
            }
            if (i === str.length - 1) { //绘制剩余部分
                ctx.fillText(str.substring(lastIndex, i + 1), layer.style.x * zoom, currentTop * zoom);
            }
            if(currentTop > height + parseInt(fontSize) * 0.3){
                break;
            }
        }
        resolve();
    })
}

调用

drawTextOnCanvas(ctx, config, layer, layer.content[0])
.then(next)
.catch(reject)

时间

layer数据


time数据.png
function drawTimeOnCanvas(ctx, config, layer){
    return new Promise((resolve, reject)=>{
        let {x, y, width, height, backgroundColor, color, fontSize, model} = layer.style;
        ctx.font = parseInt(fontSize) * zoom+"px bold "+layer.style.fontFamily;
        ctx.textAlign =layer.style.textAlign;
        ctx.fillStyle=backgroundColor;
        ctx.fillRect(x * zoom, y * zoom, width * zoom, height * zoom);
        ctx.fillStyle=color;
        const currentTop = y + parseInt(fontSize) * 1.3;
        const timeType = layer.content[0].resourceType;  
        if(timeType === 1){
            ctx.fillText(moment().format(model), x * zoom , currentTop * zoom )
        }else if(timeType === 2){
            ctx.fillText(DataFormatUtil.getWeekDay(model, new Date().getDay()), x * zoom , currentTop * zoom );
        }else if(timeType === 3){
            ctx.fillText(moment().format(model), x * zoom, currentTop * zoom)
        }else if(timeType === 4){
            ctx.fillText("0天0时0分0秒", x * zoom, currentTop * zoom)
        }else if(timeType === 5){
            ctx.fillText("0天0时0分0秒", x * zoom, currentTop * zoom)
        }else if(timeType === 6){
            ctx.fillText("0天0时0分0秒", x * zoom, currentTop * zoom)
        }
        resolve();
    });
}
上一篇下一篇

猜你喜欢

热点阅读