odf_new/odf-uniapp/utils/watermark.js

82 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 在照片左下角叠加水印文字
* @param {string} imagePath - 原始图片路径
* @param {string} text - 水印文字(如 "2025/06/15 12:00 张三"
* @returns {Promise<string>} 带水印的临时文件路径H5 返回 base64 dataURL
*/
export function addWatermark(imagePath, text) {
return new Promise((resolve, reject) => {
// #ifdef APP-PLUS
uni.getImageInfo({
src: imagePath,
success(imgInfo) {
const width = imgInfo.width
const height = imgInfo.height
const bitmap = new plus.nativeObj.Bitmap('watermark')
bitmap.load(imagePath, () => {
const canvas = new plus.nativeObj.View('watermarkView', {
left: '0px', top: '0px',
width: width + 'px', height: height + 'px'
})
canvas.drawBitmap(bitmap, {}, { left: '0px', top: '0px', width: width + 'px', height: height + 'px' })
const fontSize = Math.max(Math.floor(width * 0.03), 14)
const padding = Math.floor(fontSize * 0.8)
const textX = padding
const bgHeight = fontSize + padding * 2
canvas.drawRect(
{ color: 'rgba(0,0,0,0.4)' },
{ left: '0px', top: (height - bgHeight) + 'px', width: width + 'px', height: bgHeight + 'px' }
)
canvas.drawText(text, {
left: textX + 'px',
top: (height - bgHeight + padding) + 'px',
width: (width - textX * 2) + 'px',
height: fontSize + 'px'
}, { size: fontSize + 'px', color: '#ffffff' })
const tempPath = `_doc/watermark_${Date.now()}.jpg`
canvas.toBitmap(tempPath, {}, () => {
bitmap.clear()
resolve(tempPath)
}, (err) => {
bitmap.clear()
reject(err)
})
}, (err) => reject(err))
},
fail: reject
})
// #endif
// #ifdef H5
const img = new Image()
img.crossOrigin = 'anonymous'
img.onload = () => {
const width = img.naturalWidth
const height = img.naturalHeight
const canvas = document.createElement('canvas')
canvas.width = width
canvas.height = height
const ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0, width, height)
const fontSize = Math.max(Math.floor(width * 0.03), 14)
const padding = Math.floor(fontSize * 0.8)
const bgHeight = fontSize + padding * 2
ctx.fillStyle = 'rgba(0,0,0,0.4)'
ctx.fillRect(0, height - bgHeight, width, bgHeight)
ctx.fillStyle = '#ffffff'
ctx.font = `${fontSize}px sans-serif`
ctx.textBaseline = 'middle'
ctx.fillText(text, padding, height - bgHeight / 2)
resolve(canvas.toDataURL('image/jpeg', 0.9))
}
img.onerror = (err) => reject(err || new Error('图片加载失败'))
img.src = imagePath
// #endif
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
// 小程序端:跳过水印,直接返回原图
// resolve(imagePath)
// #endif
})
}