react + antd 4.x(此版本没有watermark水印),需要将后端传递的图片添加图片水印
- 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、水印添加完成后显示问题
- // 水印
- 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中