用 canvas 原生JS创建红色公章

javascript 复制代码
function officialseal(opt) {
	opt = opt || {
		canvas: $$('#canvas'),
		companyName: canvas.getAttribute('data-companyName'),
		sealTypeName: canvas.getAttribute('data-sealTypeName')
	};
	
	// official seal
	var ctx = opt['canvas'].getContext('2d'), color = '#f00', width = opt['canvas'].width/2, height = opt['canvas'].height/2;
	ctx.lineWidth = 6;
	ctx.strokeStyle = color;
	ctx.beginPath();
	ctx.arc(width, height, 110, 0, Math.PI*2);
	ctx.stroke();

	// five pointed star
	var radius = 30, rotato = 0;
	ctx.save();
	ctx.fillStyle = color;
	ctx.translate(width, height);
	ctx.rotate(Math.PI+rotato);
	ctx.beginPath();
	var x, y, dig = Math.PI/5*4;
	for (var i = 0;i< 5;i++) {
		 x = Math.sin(i*dig);
		 y = Math.cos(i*dig);
		 ctx.lineTo(x*radius, y*radius);
	}
	ctx.closePath();
	ctx.stroke();
	ctx.fill();
	ctx.restore();
	
	// sealTypeName
	ctx.font = '20px Microsoft YaHei';
	ctx.textBaseline = 'middle';
	ctx.textAlign = 'center';
	ctx.lineWidth = 1;
	ctx.fillStyle = color;
	ctx.fillText(opt['sealTypeName'], width, height+70);

	// companyName
	ctx.translate(width, height);
	ctx.font = '26px Microsoft YaHei';
	var  chars = opt['companyName'].split('')
		, count = chars.length
		, angle = 4*Math.PI / (3*(count - 1))
	;
	for (var i = 0; i < chars.length; i++){ // var character = chars[i];
		if (i == 0) {
			ctx.rotate(5*Math.PI/6);
		} else {
			ctx.rotate(angle);
		}
		ctx.save(); 
		ctx.translate(90, 0);
		ctx.rotate(Math.PI/2);
		ctx.fillText(chars[i], 0, 5);
		ctx.restore(); 
	}
}
html 复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width,user-scalable=yes" />
<meta name="renderer" content="webkit|ie-comp|ie-stand" />
<title>official_seal</title>
<script src="/js/u.js?v=1"></script>
</head>
<body onclick="clickHandler(event);" onchange="changeHandler(event);">
<canvas id="canvas" width="250" height="250" data-companyName="郑州快马科技有限公司" data-sealTypeName="测试专用章"></canvas>
<script src="official_seal.js?v=1"></script>
</body>
</html>
相关推荐
英俊潇洒美少年9 分钟前
Vue3 的 JSX 函数组件,每次更新都会重新运行吗?
前端·javascript·vue.js
kyriewen26 分钟前
Generator 函数:那个能“暂停”的函数,到底有什么用?
前端·javascript·面试
进击的尘埃26 分钟前
驾驭Skill市场:从3000+技能包中筛出真正能打的20个
javascript
悟空瞎说43 分钟前
生产环境Node.js内存泄漏,定位+根治全流程(图文版)
javascript·node.js
是大强1 小时前
Electron 打包用 junction 代替 symlink
前端·javascript·electron
哈__1 小时前
ReactNative项目OpenHarmony三方库集成实战:lottie-react-native
javascript·react native·react.js
就是个名称1 小时前
echart绘制天顶图
linux·前端·javascript
im_AMBER1 小时前
Leetcode 147 零钱兑换 | 单词拆分
javascript·学习·算法·leetcode·动态规划
saadiya~2 小时前
从插件冗余到极致流畅:我的 Vue 3 开发环境“瘦身”实录
前端·javascript·vue.js
Timer@2 小时前
LangChain 教程 03|快速开始:10 分钟创建第一个 Agent
前端·javascript·langchain