• 给图片添加图片水印


    一、项目场景:

            react + antd 4.x(此版本没有watermark水印),需要将后端传递的图片添加图片水印


    二、水印添加:(此代码为修改好的)

    1. import imgs from './水印图片.png'; // 引入水印图片
    2. ...代码
    3. const [url, setUrl] = useState(''); // 状态管理变量,记录图片最终的路径,vue中使用data来控制
    4. ...代码
    5. // 水印
    6. const img = document.createElement('img');
    7. img.src = backUrl; // 需要添加水印的图片地址
    8. img.crossOrigin = 'Anonymous'; // 设置跨域属性,没设置可能报cors问题
    9. img.onload = () => {
    10. const watermark = new Image();
    11. watermark.src = imgs;
    12. watermark.crossOrigin = 'Anonymous'; // 设置跨域属性
    13. // 此上面三行必须写在img.onload里面,不然会有显示问题
    14. watermark.onload = () => {
    15. const canvas = document.createElement('canvas');
    16. let imgWidth = img.width;
    17. let imgHeight = img.height;
    18. let waterWidth = watermark.width;
    19. let waterHeight = watermark.height;
    20. canvas.width = img.naturalWidth;
    21. canvas.height = img.naturalHeight;
    22. const ctx = canvas.getContext('2d');
    23. ctx.drawImage(img, 0, 0, imgWidth, imgHeight);
    24. if (imgHeight > waterHeight) {
    25. ctx.drawImage(watermark,0,0,waterWidth * (imgHeight / waterHeight),imgHeight);
    26. } else if (imgWidth > waterWidth) {
    27. ctx.drawImage(watermark,0,0,imgWidth,waterHeight * (imgWidth / waterWidth));
    28. } else {
    29. ctx.drawImage(watermark, 0, 0);
    30. }
    31. const watermarkedImgSrc = canvas.toDataURL('image/jpeg');
    32. setUrl(watermarkedImgSrc);
    33. // 添加好水印的图片URL设置上去, vue的话直接用this赋值或者this.$set(待验证)
    34. };
    35. };
    36. ...代码

    三、问题描述:

    1、水印添加问题

    2、水印添加完成后显示问题

    1. // 水印
    2. const img = document.createElement('img');
    3. img.src = backUrl; // 需要添加水印的图片地址
    4. img.crossOrigin = 'Anonymous'; // 设置跨域属性,没设置可能报cors问题
    5. const watermark = new Image();
    6. watermark.src = imgs;
    7. watermark.crossOrigin = 'Anonymous';
    8. img.onload = () => {
    9. // ...代码
    10. watermark.onload = () => {
    11. // ...代码
    12. }
    13. }

    四、原因分析:

            将watermark水印图片和img需要添加水印的图片同时创建了,以至于在img创建成功后watermark有可能还没有创建成功,导致没有进入watermark.onload的代码中


    五、解决方案:

            将watermark的创建放在img.onload中

  • 相关阅读:
    【数据结构】树的基本性质(计算树的总结点数与叶结点数)
    7-136 温度转换
    若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面,面包屑和标签页标题根据参数动态改变
    MyBatis
    zip4j压缩使用总结
    Heartbleed Vulnerability-心脏滴血漏洞
    WeakHashMap 和 HashMap 的区别是什么,何时使用?
    CSP-J1 CSP-S1 第1轮 初赛 集训视频集(2022.08.22)
    【完美云曦篇】新预告,云曦遭魔改被抓,石昊首秀九天劫光,反杀战王
    【Java实战】Mysql读写分离主从复制搭建保姆级教程
  • 原文地址:https://blog.csdn.net/qq_54455551/article/details/136183466