前端新增水印的方法有很多,以下是幾種常見且比較有效的方法,並附帶 JavaScript 程式碼示例:
1. 使用 Canvas 繪製水印:
這是最常用的方法,靈活度高,可以自定義水印的樣式、位置和透明度。
function addWatermark(imageUrl, watermarkText, options = {}) {
return new Promise((resolve, reject) => {
const img = new Image();
img.crossOrigin = 'anonymous'; // 允許跨域圖片載入
img.onload = () => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
const {
font = '16px sans-serif',
color = 'rgba(0, 0, 0, 0.5)',
position = 'bottom-right',
offsetX = 10,
offsetY = 10,
} = options;
ctx.font = font;
ctx.fillStyle = color;
let x, y;
switch (position) {
case 'top-left':
x = offsetX;
y = offsetY + parseInt(font, 10); // 偏移量加上字型大小
break;
case 'top-right':
x = canvas.width - ctx.measureText(watermarkText).width - offsetX;
y = offsetY + parseInt(font, 10);
break;
case 'bottom-left':
x = offsetX;
y = canvas.height - offsetY;
break;
case 'bottom-right':
x = canvas.width - ctx.measureText(watermarkText).width - offsetX;
y = canvas.height - offsetY;
break;
default:
x = offsetX;
y = offsetY;
}
ctx.fillText(watermarkText, x, y);
resolve(canvas.toDataURL());
};
img.onerror = reject;
img.src = imageUrl;
});
}
// 使用示例:
addWatermark('image-url.jpg', '我的水印', {
font: '20px Arial',
color: 'rgba(255, 0, 0, 0.3)',
position: 'top-left',
}).then(watermarkedImageUrl => {
const img = document.createElement('img');
img.src = watermarkedImageUrl;
document.body.appendChild(img);
}).catch(error => {
console.error('新增水印失敗:', error);
});
2. 使用偽元素(pseudo-element)::before 或 ::after:
這種方法適用於在圖片容器上新增簡單的文字或圖示水印,比較方便,但樣式控制不如 Canvas 靈活。
.watermarked-image {
position: relative;
}
.watermarked-image::before {
content: '我的水印';
position: absolute;
bottom: 10px;
right: 10px;
font-size: 16px;
color: rgba(0, 0, 0, 0.5);
}
/* HTML */
<div class="watermarked-image">
<img src="image-url.jpg" alt="Image">
</div>
3. 使用 SVG 作為水印:
SVG 水印可以實現更復雜的圖形和效果,並且縮放時不會失真。
// 建立一個 SVG 元素並新增到圖片容器中
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('width', '100%');
svg.setAttribute('height', '100%');
const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
text.textContent = '我的水印';
text.setAttribute('x', '10');
text.setAttribute('y', '20');
text.setAttribute('fill', 'rgba(0, 0, 0, 0.5)');
svg.appendChild(text);
const imageContainer = document.querySelector('.watermarked-image');
imageContainer.appendChild(svg);
**4. 使用背景圖片作為水印