290 lines
10 KiB
HTML
290 lines
10 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>印章生成器测试</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, sans-serif;
|
|
padding: 20px;
|
|
background: #f5f5f5;
|
|
}
|
|
.container {
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
background: white;
|
|
padding: 20px;
|
|
border-radius: 8px;
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
|
}
|
|
.controls {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 15px;
|
|
margin-bottom: 20px;
|
|
}
|
|
.form-group {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
label {
|
|
margin-bottom: 5px;
|
|
font-weight: bold;
|
|
}
|
|
input, select, button {
|
|
padding: 8px;
|
|
border: 1px solid #ddd;
|
|
border-radius: 4px;
|
|
}
|
|
button {
|
|
background: #6366f1;
|
|
color: white;
|
|
cursor: pointer;
|
|
border: none;
|
|
}
|
|
button:hover {
|
|
background: #5855eb;
|
|
}
|
|
.preview {
|
|
text-align: center;
|
|
padding: 20px;
|
|
background: #f9f9f9;
|
|
border-radius: 8px;
|
|
}
|
|
canvas {
|
|
border: 1px solid #ddd;
|
|
border-radius: 8px;
|
|
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<h1>🖃 印章生成器测试</h1>
|
|
|
|
<div class="controls">
|
|
<div class="form-group">
|
|
<label for="sealType">印章类型</label>
|
|
<select id="sealType">
|
|
<option value="company_round">公司圆章</option>
|
|
<option value="company_oval">公司椭圆章</option>
|
|
<option value="personal_square">个人方章</option>
|
|
<option value="personal_round">个人圆章</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="mainText">主文字</label>
|
|
<input type="text" id="mainText" placeholder="输入公司名称或姓名" value="子归云科技">
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="centerText">中心文字</label>
|
|
<input type="text" id="centerText" placeholder="印" value="印" maxlength="2">
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="sealSize">印章大小</label>
|
|
<input type="range" id="sealSize" min="200" max="600" value="300">
|
|
<span id="sizeValue">300px</span>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="sealColor">印章颜色</label>
|
|
<input type="color" id="sealColor" value="#FF0000">
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<button onclick="generateSeal()">🎨 生成印章</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="preview">
|
|
<h3>印章预览</h3>
|
|
<canvas id="sealCanvas" width="300" height="300"></canvas>
|
|
<br><br>
|
|
<button onclick="downloadSeal()" style="display:none;" id="downloadBtn">📥 下载印章</button>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
const canvas = document.getElementById('sealCanvas');
|
|
const ctx = canvas.getContext('2d');
|
|
const sizeSlider = document.getElementById('sealSize');
|
|
const sizeValue = document.getElementById('sizeValue');
|
|
|
|
// 更新大小显示
|
|
sizeSlider.addEventListener('input', function() {
|
|
sizeValue.textContent = this.value + 'px';
|
|
canvas.width = this.value;
|
|
canvas.height = this.value;
|
|
});
|
|
|
|
function generateSeal() {
|
|
const sealType = document.getElementById('sealType').value;
|
|
const mainText = document.getElementById('mainText').value;
|
|
const centerText = document.getElementById('centerText').value;
|
|
const sealSize = parseInt(document.getElementById('sealSize').value);
|
|
const sealColor = document.getElementById('sealColor').value;
|
|
|
|
if (!mainText.trim()) {
|
|
alert('请输入主文字!');
|
|
return;
|
|
}
|
|
|
|
// 清空画布
|
|
ctx.clearRect(0, 0, sealSize, sealSize);
|
|
|
|
// 设置背景
|
|
ctx.fillStyle = '#FFFFFF';
|
|
ctx.fillRect(0, 0, sealSize, sealSize);
|
|
|
|
// 设置印章颜色
|
|
ctx.strokeStyle = sealColor;
|
|
ctx.fillStyle = sealColor;
|
|
|
|
const centerX = sealSize / 2;
|
|
const centerY = sealSize / 2;
|
|
|
|
if (sealType.startsWith('company')) {
|
|
drawCompanySeal(centerX, centerY, sealSize, mainText, centerText, sealColor);
|
|
} else {
|
|
drawPersonalSeal(centerX, centerY, sealSize, mainText, sealColor);
|
|
}
|
|
|
|
document.getElementById('downloadBtn').style.display = 'inline-block';
|
|
}
|
|
|
|
function drawCompanySeal(centerX, centerY, sealSize, mainText, centerText, sealColor) {
|
|
const radius = sealSize * 0.4;
|
|
|
|
// 绘制外边框
|
|
ctx.lineWidth = 3;
|
|
ctx.beginPath();
|
|
ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI);
|
|
ctx.stroke();
|
|
|
|
// 绘制内边框
|
|
ctx.lineWidth = 1;
|
|
ctx.beginPath();
|
|
ctx.arc(centerX, centerY, radius - 15, 0, 2 * Math.PI);
|
|
ctx.stroke();
|
|
|
|
// 绘制弧形主文字
|
|
drawCurvedText(mainText, centerX, centerY, radius - 25, 24);
|
|
|
|
// 绘制五角星
|
|
drawStar(centerX, centerY - radius * 0.1, 15);
|
|
|
|
// 绘制中心文字
|
|
if (centerText.trim()) {
|
|
ctx.font = 'bold 40px SimSun, serif';
|
|
ctx.textAlign = 'center';
|
|
ctx.textBaseline = 'middle';
|
|
ctx.fillText(centerText, centerX, centerY + radius * 0.2);
|
|
}
|
|
}
|
|
|
|
function drawPersonalSeal(centerX, centerY, sealSize, mainText, sealColor) {
|
|
const size = sealSize * 0.8;
|
|
const sealType = document.getElementById('sealType').value;
|
|
|
|
// 绘制边框
|
|
ctx.lineWidth = 3;
|
|
ctx.beginPath();
|
|
if (sealType === 'personal_round') {
|
|
ctx.arc(centerX, centerY, size / 2, 0, 2 * Math.PI);
|
|
} else {
|
|
const halfSize = size / 2;
|
|
ctx.rect(centerX - halfSize, centerY - halfSize, size, size);
|
|
}
|
|
ctx.stroke();
|
|
|
|
// 绘制文字
|
|
const text = mainText.trim();
|
|
const textLength = text.length;
|
|
const fontSize = 32;
|
|
|
|
ctx.font = `bold ${fontSize}px SimSun, serif`;
|
|
ctx.textAlign = 'center';
|
|
ctx.textBaseline = 'middle';
|
|
|
|
if (textLength === 2) {
|
|
// 两字:上下排列
|
|
ctx.fillText(text[0], centerX, centerY - fontSize * 0.6);
|
|
ctx.fillText(text[1], centerX, centerY + fontSize * 0.6);
|
|
} else if (textLength === 3) {
|
|
// 三字:品字形
|
|
ctx.fillText(text[0], centerX, centerY - fontSize * 0.8);
|
|
ctx.fillText(text[1], centerX - fontSize * 0.7, centerY + fontSize * 0.4);
|
|
ctx.fillText(text[2], centerX + fontSize * 0.7, centerY + fontSize * 0.4);
|
|
} else if (textLength === 4) {
|
|
// 四字:田字格
|
|
ctx.fillText(text[0], centerX - fontSize * 0.6, centerY - fontSize * 0.6);
|
|
ctx.fillText(text[1], centerX + fontSize * 0.6, centerY - fontSize * 0.6);
|
|
ctx.fillText(text[2], centerX - fontSize * 0.6, centerY + fontSize * 0.6);
|
|
ctx.fillText(text[3], centerX + fontSize * 0.6, centerY + fontSize * 0.6);
|
|
} else {
|
|
// 其他情况:单行
|
|
ctx.fillText(text, centerX, centerY);
|
|
}
|
|
}
|
|
|
|
function drawCurvedText(text, centerX, centerY, radius, fontSize) {
|
|
ctx.font = `${fontSize}px SimSun, serif`;
|
|
ctx.textAlign = 'center';
|
|
ctx.textBaseline = 'middle';
|
|
|
|
const angleStep = (Math.PI * 1.4) / text.length;
|
|
const startOffset = -Math.PI * 0.7;
|
|
|
|
for (let i = 0; i < text.length; i++) {
|
|
const angle = startOffset + i * angleStep;
|
|
const x = centerX + Math.cos(angle) * radius;
|
|
const y = centerY + Math.sin(angle) * radius;
|
|
|
|
ctx.save();
|
|
ctx.translate(x, y);
|
|
ctx.rotate(angle + Math.PI / 2);
|
|
ctx.fillText(text[i], 0, 0);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
|
|
function drawStar(centerX, centerY, radius) {
|
|
const spikes = 5;
|
|
const outerRadius = radius;
|
|
const innerRadius = radius * 0.4;
|
|
|
|
ctx.beginPath();
|
|
for (let i = 0; i < spikes * 2; i++) {
|
|
const angle = (i * Math.PI) / spikes - Math.PI / 2;
|
|
const r = i % 2 === 0 ? outerRadius : innerRadius;
|
|
const x = centerX + Math.cos(angle) * r;
|
|
const y = centerY + Math.sin(angle) * r;
|
|
|
|
if (i === 0) {
|
|
ctx.moveTo(x, y);
|
|
} else {
|
|
ctx.lineTo(x, y);
|
|
}
|
|
}
|
|
ctx.closePath();
|
|
ctx.fill();
|
|
}
|
|
|
|
function downloadSeal() {
|
|
const link = document.createElement('a');
|
|
link.download = `seal-${Date.now()}.png`;
|
|
link.href = canvas.toDataURL('image/png');
|
|
link.click();
|
|
}
|
|
|
|
// 初始生成一个示例印章
|
|
setTimeout(() => {
|
|
generateSeal();
|
|
}, 100);
|
|
</script>
|
|
</body>
|
|
</html> |