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 相关文章推荐
JS验证邮箱格式是否正确的代码
Dec 05 Javascript
jquery 操作iframe的几种方法总结
Dec 13 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
Jul 29 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
Jan 26 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
jQuery 3.0十大新特性
Jul 06 Javascript
javascript实现下雨效果
Mar 27 Javascript
基于zTree树形菜单的使用实例
Dec 25 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
js验证身份证号码记录的方法
Apr 26 Javascript
layui表格数据复选框回显设置方法
Sep 13 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中使用smarty生成静态文件的例子
2014/04/24 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
Symfony查询方法实例小结
2017/06/28 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jQuery中next方法用法实例
2015/04/24 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
让Vue也可以使用Redux的方法
2018/05/23 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
学期自我评价
2014/01/27 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
元旦晚会活动总结
2014/07/09 职场文书
教师工作失职检讨书
2014/09/18 职场文书
美丽的大脚观后感
2015/06/03 职场文书
学校教师培训工作总结
2015/10/14 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
python函数的两种嵌套方法使用
2022/04/02 Python
正则表达式基础与常用验证表达式
2022/06/16 Javascript