给图片添加

一、项目场景:

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中

相关推荐
Tttian62210 分钟前
npm init vue@latestnpm error code ETIMEDOUT
前端·vue.js·npm
患得患失94917 分钟前
【前端】【组件库开发】【原理】【无框架开发】现代网页弹窗开发指南:从基础到优化
前端
AliciaIr22 分钟前
深入React事件机制:解密“合成事件”与“事件委托”的底层奥秘
javascript·react.js
运维咖啡吧26 分钟前
给朋友们分享个好消息 7天时间23.5k
前端·程序员·ai编程
元气小嘉38 分钟前
前端技术小结
开发语言·前端·javascript·vue.js·人工智能
神仙别闹1 小时前
基于ASP.NET+SQL Server实现(Web)企业进销存管理系统
前端·后端·asp.net
cccyi71 小时前
Vue3基础知识
javascript·vue.js
江城开朗的豌豆2 小时前
Vue计算属性:为什么我的代码突然变优雅了?
前端·javascript·vue.js
Sun_light2 小时前
5 个理由告诉你为什么有了 JS 还要用 TypeScript
前端·typescript
陈随易2 小时前
Kimi k2发布,效果比肩Sonnet4,价格与DeepSeek一致
前端·后端·程序员