前端盲水印_前端代码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

 

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • torch.zeros() 函数详解

    torch.zeros() 函数详解torch.zeros()函数返回一个形状为为size,类型为torch.dtype,里面的每一个值都是0的tensortorch.zeros(*size,out=None,dtype=None,layout=torch.strided,device=None,requires_grad=False)→Tensor测试一下:>>>x=torch.zeros([2,5],dtype=torch.float)>>>xtensor([[0

  • lc5找回windows账户信息

    lc5找回windows账户信息  示例:利用lc5获取winserver2003的账户信息。  1. 安装lc5。百度搜索lc5下载安装包,并将lc5安装到winserver2003虚拟机上。  2. 可以用一下命令创建几个待测试的账号    命令行:netusernamepassword/add创建用户           netusername…

  • hashmap put过程面试_面试时问你base在哪儿

    hashmap put过程面试_面试时问你base在哪儿一个HashMap能跟面试官扯上半个小时关注安琪拉的博客1.回复面试领取面试资料2.回复书籍领取技术电子书3.回复交流领取技术电子书前言HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。开场面试官:你先自我介绍一下吧!安琪拉:我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目…

  • springboot 使用websocket(spring常用的注入方式)

    最近单位又有一个新Java项目。涉及到扫码登录。之前项目使用的是ajax轮询的方式。感觉太low了。所以这次用webSocket的方式进行实现好。废话不多说!咱们开始!!一、首先咱们需要一张表这表是干啥的呢?就是记录一下谁扫码了。谁登录了。User_Token表字段如下:1、uuid:用于确保唯一性2、userId:谁登录的3、loginTim…

  • ss端口已被占用1080_端口已被占用1080

    ss端口已被占用1080_端口已被占用1080SS端口已被占用1080打开电脑发现ss自动启动后订阅失败,原来又是1080端口被占用了。之前的话总是自不管他,自己就好了。这次却好半天还是有问题,就不得不查一查。然后,使用netstat-ano|findstr”1080″命令可以发现是PID为4700的进程占用了,然后就用tasklist|findstr”4700″查一查这个进程是何妖孽查不出是什么东西,那…

  • 线性代数之矩阵秩的求法与示例详解

    线性代数之矩阵秩的求法与示例详解线性代数之矩阵秩的求法K阶子式在m×n的矩阵A中,任取k行、k列(k小于等于m、k小于等于n),位于这些行和列交叉处的个元素,在不改变原有次序的情况下组成的矩阵叫做矩阵A的k阶子式。不难发现矩阵A有个个k阶子式。比如有矩阵A比如取第1行,第3行,第1列,第4列交叉上的元素组成的子式即为其一个2阶子式。即按照如下划线操作:即其中的一个2阶子式是:矩阵的秩设在m×n的矩阵A中有一个不等于0的r阶子式D,且所有r+1阶子式全等于0,则D是该矩阵的最高阶非零子式。非..

发表回复

您的电子邮箱地址不会被公开。

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