vue中使用带隐藏文本信息的图片、图片水印的方法


Posted in Javascript onApril 24, 2020

一.带隐藏文本信息的图片

通过RGB 分量值的小量变动,不影响对图片的识别。因此,我们可以在图片加入文字信息。

最终达到如下效果:

vue中使用带隐藏文本信息的图片、图片水印的方法

首先,在该组件中加入img用于显示图片

<canvas ref="canvas" v-show="0"></canvas>
<img :src="imageUrl" v-if="imageUrl"/>

调用方法

encryptionImg({
    width = '',
    height = '',
    content = '',
   }){
    let img = this.img
    const imgRatio = img.naturalWidth / img.naturalHeight;
    const ctxWidth = width || img.naturalWidth;
    const ctxHeight = height || ctxWidth / imgRatio;
    this.canvas.width = ctxWidth;
    this.canvas.height = ctxHeight;
    const ctx = this.ctx;
    ctx.font = '16px Microsoft Yahei';
    ctx.textAlign = 'left';
    ctx.textBaseline = 'top';
    ctx.fillText(content, 12, ctxHeight/2, ctxWidth);17     const textData = ctx.getImageData(0, 0, ctxWidth, ctxHeight);
    this.imageUrl = this.mergeData(textData.data, 'R',ctxWidth,ctxHeight);19    }

把文字和图片整合成一张图

mergeData(newData, color, width, height) {
    let img = this.img
    this.ctx.drawImage(img, 0, 0, width, height);
    this.originalData = this.ctx.getImageData(0, 0, width, height);
    var oData = this.originalData.data;
    var bit, offset;
    switch (color) {
     case 'R':
      bit = 0;
      offset = 3;
      break;
     case 'G':
      bit = 1;
      offset = 2;
      break;
     case 'B':
      bit = 2;
      offset = 1;
      break;
    }
    for (var i = 0; i < oData.length; i++) {
     if (i % 4 == bit) {
      if (newData[i + offset] === 0 && (oData[i] % 2 === 1)) {
       if (oData[i] === 255) {
        oData[i]--
       } else {
        oData[i]++
       }
      } else if (newData[i + offset] !== 0 && (oData[i] % 2 === 0)) {
       if (oData[i] === 255) {
        oData[i]--
       } else {
        oData[i]++
       }
      }
     }
    }
    this.ctx.putImageData(this.originalData, 0, 0);
    return this.canvas.toDataURL();
   },

调用下面方法,解开图片信息

decryptImg(){
    var data = this.originalData.data;
    for(var i = 0; i < data.length; i++){
     if(i % 4 == 0){
      if(data[i] % 2 == 0){
       data[i] = 0;
      } else {
       data[i] = 255;
      }
     } else if(i % 4 == 3){
      continue;
     } else {
      data[i] = 0;
     }
    }
    this.ctx.putImageData(this.originalData, 0, 0);
    this.imageUrl = this.canvas.toDataURL();
   },

二.图片水印

watermark({
    content = '',
    container = '',
    width = '',
    height = '',
    position = 'bottom-right',
    font = '16px 微软雅黑',
    fillStyle = 'rgba(255, 255, 255, 1)',
    zIndex = 11000,
   } = {}) {
    let img = this.img
    const imgRatio = img.naturalWidth / img.naturalHeight;
    const ctxWidth = width || img.naturalWidth;
    const ctxHeight = height || ctxWidth / imgRatio;
    this.canvas.width = ctxWidth;
    this.canvas.height = ctxHeight;
    const ctx = this.ctx;
    ctx.drawImage(img, 0, 0, ctxWidth, ctxHeight);
    ctx.shadowColor = 'rgba(0, 0, 0, 0.2)';
    ctx.shadowOffsetX = 2;
    ctx.shadowOffsetY = 2;
    ctx.shadowBlur = 2;
    ctx.font = font;
    ctx.fillStyle = fillStyle;
    if(position == 'center') {
     ctx.textAlign = 'center';
     ctx.textBaseline = 'middle';
     ctx.fillText(content, ctxWidth / 2, ctxHeight / 2, ctxWidth)
    }else if(position == 'bottom-right') {
     ctx.textAlign = 'right';
     ctx.textBaseline = 'alphabetic';
     ctx.fillText(content, ctxWidth-12, ctxHeight-12, ctxWidth)
    }
    const base64Url = this.canvas.toDataURL();
    if(container) {
     const div = document.createElement('div');
     div.setAttribute('style', ` width: ${ctxWidth}px; height: ${ctxHeight}px; z-index: ${zIndex}; 
     pointer-events: none; background-repeat: repeat; background-image: url('${base64Url}')`);
     container.insertBefore(div, null);
    }
    this.imageUrl = base64Url
   }

参考

http://www.alloyteam.com/2016/03/image-steganography/

到此这篇关于vue中使用带隐藏文本信息的图片、图片水印的文章就介绍到这了,更多相关vue 隐藏文本信息图片水印内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery对表单操作2
Apr 06 Javascript
jQuery.each使用详解
Jul 07 Javascript
详解javascript事件绑定使用方法
Oct 20 Javascript
原生js实现对Ajax的封装(仿jquery)
Jan 22 Javascript
js获取元素的偏移量offset简单方法(必看)
Jul 05 Javascript
JS实现点击循环切换显示内容的方法
Oct 19 Javascript
AngularJS实现的简单拖拽功能示例
Jan 02 Javascript
利用js实现前后台传送Json的示例代码
Mar 29 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
详解vue-router导航守卫
Jan 19 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
Vue + ts实现轮播插件的示例
Nov 10 Javascript
基于Vue实现微前端的示例代码
Apr 24 #Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 24 #Javascript
小程序开发之模态框组件封装
Apr 23 #Javascript
详解Vue3中对VDOM的改进
Apr 23 #Javascript
微信小程序实现滑动操作代码
Apr 23 #Javascript
微信小程序图片右边加两行文字的代码
Apr 23 #Javascript
Vue中通过vue-router实现命名视图的问题
Apr 23 #Javascript
You might like
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
Python进行数据提取的方法总结
2016/08/22 Python
python使用fork实现守护进程的方法
2017/11/16 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python 显示数组全部元素的方法
2018/04/19 Python
Django之模型层多表操作的实现
2019/01/08 Python
Python绘图实现显示中文
2019/12/04 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
促销活动总结报告
2014/04/26 职场文书
品质标语大全
2014/06/21 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
初婚未育证明样本
2014/10/24 职场文书
党校学习党性分析材料
2014/12/19 职场文书
党员倡议书
2015/01/19 职场文书
离婚案件被告代理词
2015/05/23 职场文书
担保书格式范文
2015/09/22 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
python 爬取天气网卫星图片
2021/06/07 Python
python中对列表的删除和添加方法详解
2022/02/24 Python
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers