canvas 自定义画布,在画布上增加(边框 图片 文字 )

编程入门 行业动态 更新时间:2024-10-05 15:25:52

canvas 自定义<a href=https://www.elefans.com/category/jswz/34/1760031.html style=画布,在画布上增加(边框 图片 文字 )"/>

canvas 自定义画布,在画布上增加(边框 图片 文字 )

先说下我的功能需求:
通过画布,自定义一个区域大小,在这个区域内:添加背景图片、图中图叠加、画内外边框、设置文字(文字的字体和大小颜色)

效果图

背景图片就是鸣人和雏田,右下角的属于图中图叠加效果,左下和右下都是分别画的两个区域框

不需要用到上传图片功能的,这一步可以略过,直接看下面 canvasdiv() 方法
1.右下角的小图,我做的是上传图片,上面有个附图上传的按钮,这个用的是element-ui,代码我贴下面了,也可以不选择上传,自己从本地获取一张图片也可以

<el-form-item label="附图上传" prop="dh"><div><el-upload class="upload-demo" action="" :on-preview="handlePreview" :on-remove="handleRemove":before-remove="beforeRemove" :on-change="uploadTU" :auto-upload="false" :limit="1"list-type="picture" :on-exceed="handleExceed" :file-list="fileList"><el-button size="small" type="primary">点击上传附图</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div></el-upload></div>
</el-form-item>
//附图上传调用的方法,这里主要是获取了图片的地址,
//这里这个 this.futuimage 会在做附图的时候用到,所以我这里要保存一下这个图片地址
uploadTU(file, filelist) {this.futuimage = file.url
},

画布上图、自定义文字、画线

1.先定义一个canvas容器

<div id="div"><canvas id="canvas"></canvas>
</div>

2.这个方法自己写个点击事件触发,我是用按钮触发的,按钮代码我就不写了

//图片生成pdn的方法canvasdiv(dataUrl) {var canvas = document.getElementById("canvas");canvas.width = 1545;canvas.height = 855;var ctx = canvas.getContext("2d");//这里就是背景图,我获取的是本地图片var image = new Image();//这里可以放png图片,也可以放图片的base64image.src = './img/beijingtu.png'; //图例图片var tuli = new Image();tuli.src = './img/xiao.png';//附图图片var futu = new Image();futu.src = this.futuimage;	//这个我放的是图片的base64,主要给大家说明一下可以放这种类型数据//从这一步开始,就开始画布了,在画布里设置图片呀 文字呀 边框呀image.onload = function () {var imgwidth = 1400;	//背景图宽度var imgheight = 750;	//背景图高度var left = (canvas.width - imgwidth) / 2;var top = (canvas.height - imgheight) / 2;//第一个参数image就是我读取的本地png图片,这里我试过放base64 也可以//第二个参数left 就是 x坐标,第三个参数top就是 y坐标 ,坐标轴懂吧 x和y//第四个和第五个参数就是背景图的宽和高,单位是像素px//多说一句第一个参数 image 看你自己需求放什么,但是我发现base64图片不能自适应ctx.drawImage(image, left, top, imgwidth, imgheight);	//背景图上图到画布//外框ctx.moveTo(left - 20, top - 20); //将画笔移动到坐标 x和yctx.lineTo(left + imgwidth + 20, top - 20); //从画笔位置绘制直线到坐标 x和yctx.lineTo(left + imgwidth + 20, top + imgheight + 20); //从当前位置绘制直线到ctx.lineTo(left - 20, top + imgheight + 20); //.从当前位置...ctx.closePath(); //闭合线条ctx.lineWidth = 3; //线宽ctx.strokeStyle = 'black'; //描边颜色ctx.stroke(); //渲染直线(描边)//最内的框ctx.moveTo(left, top); //将画笔移动到坐标ctx.lineTo(left + imgwidth, top); //从画笔位置绘制直线到坐标ctx.lineTo(left + imgwidth, top + imgheight); //从当前位置绘制直线到ctx.lineTo(left, top + imgheight); // 从当前位置ctx.closePath(); //闭合线条ctx.lineWidth = 1; //线宽ctx.strokeStyle = 'black'; //描边颜色ctx.stroke(); //渲染直线(描边)//看一下效果图左下角有个图例,背景色是白色,主要是填充区域颜色需要加这一行代码ctx.beginPath(); //开启路径绘制,不加它无法填充区域颜色,ctx.moveTo(left, imgheight / 4 * 3 + top); //将画笔移动到坐标ctx.lineTo(left + this.tuli_width, imgheight / 4 * 3 + top); //从画笔位置绘制直线到坐标ctx.lineTo(left + this.tuli_width, imgheight + top); //从当前位置绘制直线到ctx.lineTo(left, imgheight + top); //.从当前位置ctx.closePath(); //闭合线条ctx.fillStyle = 'white';ctx.fill(); //设置封闭图形填充ctx.lineWidth = 1; //线宽ctx.strokeStyle = 'black'; //描边颜色ctx.stroke(); //渲染直线(描边)//附图ctx.beginPath(); //开启路径绘制,不加它无法填充区域颜色ctx.moveTo(imgwidth - 300 + left, imgheight / 4 * 3 + top); //将画笔移动到坐标ctx.lineTo(left + imgwidth, imgheight / 4 * 3 + top); //从画笔位置绘制直线到坐标ctx.lineTo(left + imgwidth, imgheight + top); //从当前位置绘制直线到ctx.lineTo(imgwidth - 300 + left, imgheight + top); //.从当前位置ctx.lineWidth = 1; //线宽ctx.strokeStyle = 'black'; //描边颜色ctx.fillStyle = 'white';ctx.fill(); //设置封闭图形填充ctx.stroke(); //渲染直线(描边)ctx.closePath(); //闭合线条ctx.drawImage(futu, imgwidth - 300 + left, imgheight / 4 * 3 + top + 20, 300, imgheight / 4 - 20); //添加附图图片//附图俩字下面的横线ctx.moveTo(imgwidth - 300 + left, imgheight / 4 * 3 + top + 25); //将画笔移动到坐标ctx.lineTo(left + imgwidth, imgheight / 4 * 3 + top + 25);ctx.lineWidth = 1; //线宽ctx.strokeStyle = 'black'; //描边颜色ctx.stroke(); //渲染直线(描边)// 绘制文字(文本内容,x坐标,y坐标)ctx.font = "13px serif";    //文字大小ctx.fillStyle = "black";    //文字颜色ctx.textAlign = "center";   //文字居中ctx.font = "23px 宋简体"ctx.fillText("标题", canvas.width / 2, canvas.height - 835);ctx.font = "15px 黑体"ctx.fillText("图例", left + 75, imgheight / 4 * 3 + top + 17);ctx.fillText("小图区域", imgwidth - 150 + left, imgheight / 4 * 3 + top + 17);ctx.font = "13px 黑体"ctx.fillText("自定义文字", left - 10, canvas.height - 835);ctx.fillText("1:50000", canvas.width / 2, canvas.height - 12);ctx.fillText(that.getCurrentTime(), left + imgwidth - 20, canvas.height - 12);ctx.fillText("XXX", left - 10, canvas.height - 12);//展示生成后的图片效果--第二张图var base64 = canvas.toDataURL();document.getElementById("base64Img").src = base64;const download = document.getElementById("download");var ba64 = canvas.toDataURL("image/png");// 点击图片下载// canvas.onclick = function () {//     //download.click();//     var input1 = document.getElementById("upload");//     if (typeof FileReader === 'undefined') {//         alert("抱歉,你的浏览器不支持 FileReader");//         input1.setAttribute('disabled', 'disabled');//     } else {//         // console.log(typeof FileReader);//         input1.addEventListener('change', that.readFile(), false);//         /*input1.addEventListener('change',function (e){//       // console.log(e.target.files[0]);//       console.log(this.files[0]);//       },false); *///     }// };}},

更多推荐

canvas 自定义画布,在画布上增加(边框 图片 文字 )

本文发布于:2024-02-27 19:37:43,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766074.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:画布   自定义   边框   文字   图片

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!