base64图片加水印
/**
* 在Base64图片上添加水印
* @param {string} base64Image - Base64编码的图片字符串
* @param {Object} watermarkConfig - 水印配置对象
* @param {string} watermarkConfig.text - 水印文本
* @param {string} watermarkConfig.fontFamily - 字体样式,例如 'Arial'
* @param {string} watermarkConfig.color - 文字颜色,例如 '#000'
* @param {number} watermarkConfig.opacity - 文字透明度,例如 0.5
* @param {string} watermarkConfig.position - 水印位置,例如 'lowerRight'
* @param {number} watermarkConfig.angle - 水印旋转角度,例如 45
* @param {string} watermarkConfig.strokeColor - 描边颜色,例如 '#000'
* @param {number} watermarkConfig.strokeWidth - 描边宽度,例如 2
* @param {number} watermarkConfig.fontSizeRatio - 字体大小相对于图片宽度的比例,例如 0.05
* @returns {Promise<string>} - 返回带有水印的Base64图片字符串
*/
const addWatermarkToBase64Image = (base64Image, watermarkConfig) => {
return new Promise((resolve, reject) => {
// 创建一个新的 Image 对象
const img = new Image()
// 当图片加载完成后,获取其宽度和高度
img.onload = function () {
const originalWidth = img.width
const originalHeight = img.height
// 计算设备DPI
const dpr = window.devicePixelRatio || 1
// 设置Canvas的宽度和高度为原始尺寸乘以DPR
const canvas = document.createElement('canvas')
canvas.width = originalWidth * dpr
canvas.height = originalHeight * dpr
// 使用CSS缩放Canvas以适应原始尺寸
canvas.style.width = `${originalWidth}px`
canvas.style.height = `${originalHeight}px`
const ctx = canvas.getContext('2d')
// 设置Canvas的缩放比例
ctx.scale(dpr, dpr)
// 绘制原始图片
ctx.drawImage(img, 0, 0)
// 保存当前绘图状态
ctx.save()
// 根据水印位置设置 x 和 y 坐标
let x, y
switch (watermarkConfig.position) {
case 'upperLeft':
x = 10 * dpr
y = 10 * dpr
break
case 'upperRight':
x = originalWidth - 10 * dpr
y = 10 * dpr
break
case 'lowerLeft':
x = 10 * dpr
y = originalHeight - 10 * dpr
break
case 'lowerRight':
x = originalWidth - 10 * dpr
y = originalHeight - 10 * dpr
break
case 'center':
x = (originalWidth / 2) * dpr
y = (originalHeight / 2) * dpr
break
default:
x = 10 * dpr
y = 10 * dpr
}
// 设置水印旋转角度
ctx.translate(x, y)
ctx.rotate((watermarkConfig.angle * Math.PI) / 180)
// 计算字体大小
const fontSize = originalWidth * watermarkConfig.fontSizeRatio * dpr
const font = `${fontSize}px ${watermarkConfig.fontFamily}`
// 设置水印样式
ctx.font = font
ctx.fillStyle = watermarkConfig.color
ctx.globalAlpha = watermarkConfig.opacity
// 绘制水印文本描边
ctx.strokeStyle = watermarkConfig.strokeColor || '#000'
ctx.lineWidth = watermarkConfig.strokeWidth || 2
ctx.strokeText(watermarkConfig.text, 0, 0)
// 绘制水印文本
ctx.fillText(watermarkConfig.text, 0, 0)
// 恢复绘图状态
ctx.restore()
// 将带有水印的图片转换为Base64字符串
const newBase64Image = canvas.toDataURL('image/png')
resolve(newBase64Image)
}
// 当图片加载失败时,处理错误
img.onerror = function () {
reject('图片加载失败')
}
// 设置图片的 src 属性为 Base64 字符串
img.src = base64Image
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
上次更新: 2025/01/03, 13:53:09