一、项目场景:
react + antd 4.x(此版本没有watermark水印),需要将后端传递的图片添加图片水印
二、水印添加:(此代码为修改好的)
javascript
import imgs from './水印图片.png'; // 引入水印图片
...代码
const [url, setUrl] = useState(''); // 状态管理变量,记录图片最终的路径,vue中使用data来控制
...代码
// 水印
const img = document.createElement('img');
img.src = backUrl; // 需要添加水印的图片地址
img.crossOrigin = 'Anonymous'; // 设置跨域属性,没设置可能报cors问题
img.onload = () => {
const watermark = new Image();
watermark.src = imgs;
watermark.crossOrigin = 'Anonymous'; // 设置跨域属性
// 此上面三行必须写在img.onload里面,不然会有显示问题
watermark.onload = () => {
const canvas = document.createElement('canvas');
let imgWidth = img.width;
let imgHeight = img.height;
let waterWidth = watermark.width;
let waterHeight = watermark.height;
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, imgWidth, imgHeight);
if (imgHeight > waterHeight) {
ctx.drawImage(watermark,0,0,waterWidth * (imgHeight / waterHeight),imgHeight);
} else if (imgWidth > waterWidth) {
ctx.drawImage(watermark,0,0,imgWidth,waterHeight * (imgWidth / waterWidth));
} else {
ctx.drawImage(watermark, 0, 0);
}
const watermarkedImgSrc = canvas.toDataURL('image/jpeg');
setUrl(watermarkedImgSrc);
// 添加好水印的图片URL设置上去, vue的话直接用this赋值或者this.$set(待验证)
};
};
...代码
三、问题描述:
1、水印添加问题
2、水印添加完成后显示问题
javascript
// 水印
const img = document.createElement('img');
img.src = backUrl; // 需要添加水印的图片地址
img.crossOrigin = 'Anonymous'; // 设置跨域属性,没设置可能报cors问题
const watermark = new Image();
watermark.src = imgs;
watermark.crossOrigin = 'Anonymous';
img.onload = () => {
// ...代码
watermark.onload = () => {
// ...代码
}
}
四、原因分析:
将watermark水印图片和img需要添加水印的图片同时创建了,以至于在img创建成功后watermark有可能还没有创建成功,导致没有进入watermark.onload的代码中
五、解决方案:
将watermark的创建放在img.onload中