前端盲水印_前端代码review

前端盲水印_前端代码review需求给图片加上看不到的水印,当通过其他的方式可以清楚的看到图片中暗藏的水印,以此方式追溯到泄密的人解决办法利用canvas实现图片和水印的绘制,具体过程如下:新建canvas,宽度和高度取要加水印的图片的宽度和高度 在该canvas上绘制要添加的水印文字,文字透明度设置要特别的低,但是当水印透明度小于等于0.003,不可恢复到水印。所以我们设置透明度要不得低于0.003 将该canvas转成img(为什么canvas要转成img?之前遇到canvas在移动端无法长按出现保存、转发等操作)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

需求

给图片加上看不到的水印,当通过其他的方式可以清楚的看到图片中暗藏的水印,以此方式追溯到泄密的人

解决办法

利用canvas实现图片和水印的绘制,具体过程如下:

  1. 新建canvas,宽度和高度取要加水印的图片的宽度和高度
  2. 在该canvas上绘制要添加的水印文字,文字透明度设置要特别的低,但是当水印透明度小于等于0.003,不可恢复到水印。所以我们设置透明度要不得低于0.003
  3. 将该canvas转成img(为什么canvas要转成img?之前遇到canvas在移动端无法长按出现保存、转发等操作)

代码如下

// imgStr为img的dom字符串
handleImgWatermark(imgStr){
  // 获取img的src的正则
  let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i
  let matched = imgStr.match(srcReg)
  // 生成canvas src是必须的,如果没有src则不处理,仍返回之间的img字符串
  if(matched && matched.length > 1){
    // 获取该img的src
    let curSrc = matched[1]
    // 如果是.gif的图片则不加水印
    if(curSrc.indexOf('.gif') > -1){
      return
    }
    let that = this
    // 计算该图片展示的宽高(这里主要是为了当图片的宽度大于设备的宽度时将图片的宽度设置为设备的宽度;如果图片的宽度没有大于设备的宽度则按图片原先的宽度展示)
    let handleObj = that.handleImgWidthAndHeight(imgStr)
    let imgWidth = handleObj.width
    let imgHeight = handleObj.height
    let image = new Image()
    image.src = curSrc
    image.setAttribute("crossOrigin",'Anonymous')
    image.onload = function(){
      // 创建canvas对象
      let cvs = document.createElement("canvas");
      // 获取canvas对象的画笔工具
      let ctx = cvs.getContext('2d');
      // 设置canvas的宽和高
      cvs.width = imgWidth || image.width
      cvs.height = imgHeight || image.height
      // 将图片绘制到画布上
      ctx.drawImage(image, 0, 0, imgWidth, imgHeight);
      // 绘制的文字
      let filltext = that.userInfo ? (that.userInfo.fullName + that.userInfo.name) : '猿辅导水印'
      // 绘制的起点
      let x = 20,y=20;
      // 在canvas图片上面绘制文字,文字所占的宽高为100*30,所以在图片上每100*30的区域都应该有一个水印
      while(x<imgWidth && y<imgHeight){
        ctx.font = "12px serif";
        ctx.fillStyle = 'rgba(0,0,0,0.01)'
        ctx.fillText(filltext,x,y)
        // 计算画水印的起始坐标
        x = (x+100) >= imgWidth ? 20 : (x+100)
        y = x === 20 ? (y+30) : y
      }
      // 将处理好后的canvas转成image
      let src = cvs.toDataURL('image/png')
      // 将原先的htm文本中该img字符串替换,之后可以渲染新的文本内容
      that.handledContent = that.handledContent.replace(imgStr,`<img src="${src}"/>`)
    }
  }
},

Jetbrains全家桶1年46,售后保障稳定

效果

加了水印的图肉眼看上去是这个样子的

前端盲水印_前端代码review

在ps中经过图像的处理我们可以得到下图

前端盲水印_前端代码review

 

可以看到隐藏的水印文字,由于我没有学过专业的图像处理技术,只能简单的看懂文字,并没有很清晰,具体如何很清晰的在不同的图像下看到暗藏的水印我觉得设计部的同事应该会很清楚

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226844.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mask rcnn实现教程「建议收藏」

    mask rcnn实现教程「建议收藏」一,首先去github上下载mask-rcnn源码,这里提供一个百度网盘地址链接:https://pan.baidu.com/s/1htJYyNy密码:0r2b含可运行DEMO更新链接:https://pan.baidu.com/s/1HBPtIPz0xpZsCprl7rc6hw密码:bvm5二,下载对应的mask_rcnn_coco.h5模型,这里给出百度网盘下载地址链接:h……

    2022年10月4日
    3
  • Java 图形界面开发–图文并茂建立学生管理系统

    Java 图形界面开发–图文并茂建立学生管理系统(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/50932501冷血之心的博客)图形用户界面(GraphicsUserInterface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~…

    2022年6月21日
    27
  • 类加载器的方法_JS加载器

    类加载器的方法_JS加载器packagecom.tech.load.def;/***@authorlw*@since2021/12/3*/publicclassUserImpl{static{System.out.println(“UserImplinit…”);}}packagecom.tech.load.def;/***@authorlw*@since2021/12/3*/publicclassDe..

    2025年9月18日
    2
  • Linux宝塔面板安装

    Linux宝塔面板安装

    2021年6月3日
    108
  • Qt QStringList的简单使用方法「建议收藏」

    Qt QStringList的简单使用方法「建议收藏」从QList继承而来,它提供快速索引为基础的接入以及快速插入和清除其成员函数用于操作这个字符串列表如append(),insert(),replace(),removeAll(),removeAt(),removeFirst(),removeLast(),andremoveOne()等1.  增加字符串  可以通过append(),或使用  QString

    2022年6月4日
    97
  • java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?「建议收藏」

    java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?「建议收藏」静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的)。需要澄清的最新情况:注意,只有变量及其技术值(原语或引用)存储在PermGen空间中。如果静态变量是对象的引用,则该对象本身存储在堆的正常部分(年轻/旧代或幸存者空间)。这些对象(除非它们是类等内部对象)是不存储在PermGen空间。例子:staticinti=1…

    2022年5月2日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号