html 画透明圆公章之js

2022年,第一个就是画公章,画一个公章是很简单,但是字体才是关键,一般来说是宋体,宽高比为3:2

字体等有空,我再上传分享。

以下是代码供参考,这是我改进过的版本。

<!DOCTYPE html>
<html>
   <head>
      <title>Bootstrap 模板</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <!-- 引入 Bootstrap -->
      <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
 
      <!-- HTML5 Shiv 和 Respond.js 用于让 IE8 支持 HTML5元素和媒体查询 -->
      <!-- 注意: 如果通过 file://  引入 Respond.js 文件,则该文件无法起效果 -->
      <!--[if lt IE 9]>
         <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
         <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
      <![endif]-->
      <!-- jQuery (Bootstrap 的 JavaScript 插件需要引入 jQuery) -->
      <script src="https://code.jquery.com/jquery.js"></script>
      <!-- 包括所有已编译的插件 -->
   </head>
   <body style="background-color:#ccc">
   <input type="button" value="盖章" class="btn btn-success" onclick="gaizhang()">
   <div id="container" class="canvas">
        <canvas id="canvas"  width="250" height="250"></canvas>
   </div>
</script>
    <script name="自定义印章">
        function gaizhang() {
            //清除上次画布
            $('#canvas').remove();
            $('#container').append('<canvas id="canvas" width="250" height="250"></canvas>');
            var canvas = document.getElementById("canvas");
            var context = canvas.getContext('2d');

            var text = "电子业务专用章";
            var companyName = "龙岩市装逼青年活动中心";

            // 绘制印章边框
            var width = canvas.width / 3;
            var height = canvas.height / 3;
            context.lineWidth = 5; //圆边粗细
            context.strokeStyle = "#f00";
            context.beginPath();
            context.arc(width, height, 80, 0, Math.PI * 2);//宽、高、半径
            context.stroke();

            //画五角星
            create5star(context,width,height,28,"#f00",0);

            // 绘制印章名称
            context.font = '24px 公章字体';
			//context.font = '24px 长城长宋体';
            context.textBaseline = 'middle';//设置文本的垂直对齐方式
            context.textAlign = 'center'; //设置文本的水平对对齐方式
            context.lineWidth=1;
            context.strokeStyle = '#f00';
            //context.strokeText(text,width,height+45); //旧方式不支持调间距
            //--------调间距改进开始
			//context.fillText(text, width, height, 50)
			//context.wrapText(text, x, y, maxWidth, lineHeight);
			//context.wrapText(text, width, height, 50, 1);
			var letterSpacing=-4; //字间距
			var x=width,y=height+50;
			var arrText = text.split('');
			var align = context.textAlign || 'left';
			// 这里仅考虑水平排列
			var originWidth = context.measureText(text).width;
			// 应用letterSpacing占据宽度
			var actualWidth = originWidth + letterSpacing * (arrText.length - 1);
			// 根据水平对齐方式确定第一个字符的坐标
			if (align == 'center') {
				x = x - actualWidth / 2;
			} else if (align == 'right') {
				x = x - actualWidth;
			}
			
			// 临时修改为文本左对齐
			context.textAlign = 'left';
			// 开始逐字绘制
			arrText.forEach(function (letter) {
				var letterWidth = context.measureText(letter).width;
				context.strokeText(letter, x, y);
				// 确定下一个字符的横坐标
				x = x + letterWidth + letterSpacing;
			});
			// 对齐方式还原
			context.textAlign = align;
            //--------调间距改进结束

            // 绘制印章单位
            context.translate(width,height);// 平移到此位置,
            context.font = '30px 公章字体';
            var  count = companyName.length;// 字数
            var  angle = 3.8*Math.PI/(3*(count - 1));// 单位名称各字字间角度
			var microRate=5.2; //微调整体旋转角度//改进处
            var chars = companyName.split("");
            var c;
            for (var i = 0; i < count; i++) {
                c = chars[i];// 需要绘制的字符
                if (i == 0) {
                    context.rotate(microRate * Math.PI / 6); //角度计算

                } else{
                    context.rotate(angle);
                }

                context.save();
                context.translate(60, 0);// 平移到此位置,此时字和x轴垂直,公司名称和最外圈的距离
                context.rotate(Math.PI / 2);// 旋转90度,让字平行于x轴
                context.strokeText(c, 0, 0);// 此点为字的中心点
                context.restore();
            }
        }

        //绘制五角星
        function create5star(context, sx, sy, radius, color, rotato) {
            context.save();
            context.fillStyle = color;
            context.translate(sx, sy);//移动坐标原点
            context.rotate(Math.PI + rotato);//旋转
            context.beginPath();//创建路径
            var x = Math.sin(0);
            var y = Math.cos(0);
            var dig = Math.PI / 5 * 4;
            for (var i = 0; i < 5; i++) {//画五角星的五条边
                var x = Math.sin(i * dig);
                var y = Math.cos(i * dig);
                context.lineTo(x * radius, y * radius);
            }
            context.closePath();
            //context.stroke(); //画边,不规则,此处取消。
            context.fill();
            context.restore();
        }

    </script>
   </body>
</html>
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注