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

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

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

最终达到如下效果:

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

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

调用方法

1 encryptionImg({
 2         width = '',
 3         height = '',
 4         content = '',
 5       }){
 6         let img = this.img
 7         const imgRatio = img.naturalWidth / img.naturalHeight;
 8         const ctxWidth = width || img.naturalWidth;
 9         const ctxHeight = height || ctxWidth / imgRatio;
10         this.canvas.width = ctxWidth;
11         this.canvas.height = ctxHeight;
12         const ctx = this.ctx;
13         ctx.font = '16px Microsoft Yahei';
14         ctx.textAlign = 'left';
15         ctx.textBaseline = 'top';
16         ctx.fillText(content, 12, ctxHeight/2, ctxWidth);17         const textData = ctx.getImageData(0, 0, ctxWidth, ctxHeight);
18         this.imageUrl = this.mergeData(textData.data, 'R',ctxWidth,ctxHeight);19       }

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

1 mergeData(newData, color, width, height) {
 2         let img = this.img
 3         this.ctx.drawImage(img, 0, 0, width, height);
 4         this.originalData = this.ctx.getImageData(0, 0, width, height);
 5         var oData = this.originalData.data;
 6         var bit, offset;
 7         switch (color) {
 8           case 'R':
 9             bit = 0;
10             offset = 3;
11             break;
12           case 'G':
13             bit = 1;
14             offset = 2;
15             break;
16           case 'B':
17             bit = 2;
18             offset = 1;
19             break;
20         }
21         for (var i = 0; i < oData.length; i++) {
22           if (i % 4 == bit) {
23             if (newData[i + offset] === 0 && (oData[i] % 2 === 1)) {
24               if (oData[i] === 255) {
25                 oData[i]--
26               } else {
27                 oData[i]++
28               }
29             } else if (newData[i + offset] !== 0 && (oData[i] % 2 === 0)) {
30               if (oData[i] === 255) {
31                 oData[i]--
32               } else {
33                 oData[i]++
34               }
35             }
36           }
37         }
38         this.ctx.putImageData(this.originalData, 0, 0);
39         return this.canvas.toDataURL();
40       },

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

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();
      },

二.图片水印

1 watermark({
 2         content = '',
 3         container = '',
 4         width = '',
 5         height = '',
 6         position = 'bottom-right',
 7         font = '16px 微软雅黑',
 8         fillStyle = 'rgba(255, 255, 255, 1)',
 9         zIndex = 11000,
10       } = {}) {
11         let img = this.img
12         const imgRatio = img.naturalWidth / img.naturalHeight;
13         const ctxWidth = width || img.naturalWidth;
14         const ctxHeight = height || ctxWidth / imgRatio;
15         this.canvas.width = ctxWidth;
16         this.canvas.height = ctxHeight;
17         const ctx = this.ctx;
18         ctx.drawImage(img, 0, 0, ctxWidth, ctxHeight);
19         ctx.shadowColor = 'rgba(0, 0, 0, 0.2)';
20         ctx.shadowOffsetX = 2;
21         ctx.shadowOffsetY = 2;
22         ctx.shadowBlur = 2;
23         ctx.font = font;
24         ctx.fillStyle = fillStyle;
25         if(position == 'center') {
26           ctx.textAlign = 'center';
27           ctx.textBaseline = 'middle';
28           ctx.fillText(content, ctxWidth / 2, ctxHeight / 2, ctxWidth)
29         }else if(position == 'bottom-right') {
30           ctx.textAlign = 'right';
31           ctx.textBaseline = 'alphabetic';
32           ctx.fillText(content, ctxWidth-12, ctxHeight-12, ctxWidth)
33         }
34         const base64Url = this.canvas.toDataURL();
35         if(container) {
36           const div = document.createElement('div');
37           div.setAttribute('style', ` width: ${ctxWidth}px; height: ${ctxHeight}px; z-index: ${zIndex};
38           pointer-events: none; background-repeat: repeat; background-image: url('${base64Url}')`);
39           container.insertBefore(div, null);
40         }
41         this.imageUrl = base64Url42       }

参考

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

(0)

相关推荐

  • 自己动手做一个识别手写数字的web应用04

    接着往期的3篇继续,一步步动手做: 自己动手做一个识别手写数字的web应用01 自己动手做一个识别手写数字的web应用02 自己动手做一个识别手写数字的web应用03 如果你练习里前面三篇,相信你已经 ...

  • 使用canvas完成帧动画(方向键控制行走的小人)

    根据此精灵图设置动图 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  • 函数内赋值失效问题

    我用get向我的女神表白,可是她总是不理我,我绞尽脑汁,就是找不到原因,最后抱着试试的方法,就用post向女神表白,她马上就同意了.我一直不明白这是为什么? 有知道的可以评论下.还有,在这个前所未有的 ...

  • 如何突出显示PDF文档中的一些重要文本信息

    PDF文档中如果存在着太多的文字时,阅读者会容易遗漏很多重要的信息.但如果,文档中存在着一些特殊标记的文字时,比如标黄.标红文本时,很多人都会给予特别关注. 因此,当大家在使用pdfFactory专业 ...

  • 干支相克中隐藏的信息

    干支相克,无论是干克支,还是支克干,都体现了"天地不载"之象,意味着天和地缺乏沟通,不能有机融合,犹如天和地打仗一样.既然是打仗,就免不了战争牺牲,战争结果暗示我们生活中某方面会出 ...

  • 农历正月初干支中隐藏的信息

    撼龙风水洪国珍/文 旧时农村老人在过年时,常念叨着"一鸡.二犬.三猪.四羊.五牛.六马.七人.八谷.九油.十麦". 从初一至初十看天气阴晴风雨决定从鸡至人至麦的生存和生长歉收状况. ...

  • 计算机中常见的文本信息存储格式

    .txt纯文本文件,不携带字体.字型.颜bai色等文字修饰控制格式,一般文字处理软件都能打开它 .doc使用Microsoft Word创建的格式化文件,用于一般的图文排版 .html用超文本标记语言 ...

  • 那些隐藏在早期游戏中有趣或龌龊的信息

    译_魏咩也 / 译言网 那是 80 年代,也有可能是 90 年代.你是一个苦逼的程序猿在辛苦锄着代码地,而你所属的公司甚至不会给你一丝尊重.你所得到的只会是一些蠢极了的外号. 你压力山大.你挫折感爆棚 ...

  • 菜鸟记443-WPS中自带的日程表,重要事项不遗忘,还能分享!

    万一您身边的朋友用得着呢? 各位朋友早上好,小菜继续和您分享经验之谈,截止今日小菜已分享350+篇经验之谈,可以文章编号或关键词进行搜索 以下才是今天的正式内容-- 摘要:本文介绍WPS中的日程安排功 ...

  • Excel如何在单元格中输入“001”的文本型序列?

    文本型的序列,有一种比较特殊的就是"001"类型的了,如果直接输入的话,软件会自动变为1,下面小编就来教大家如何输入吧! 1.打开Excel表格,直接在单元格中输入"00 ...

  • 如何在word文档中插入带边框的对勾

    在之前的文章中,笔者介绍了如何在word文档中插入不带边框的对勾的方法(感兴趣读者可以参考如何在word文档中输入对勾),在有些调查问卷或文档中要求输入带有边框的对勾,如何输入带有边框的对勾呢?其输入 ...

  • 如何将单元格中的数字和文本分开?

    问:一列中,有比如 123.123-1.1234-1.123三.123-1三.1234-1四的数据,要求把数字和文字分解开分列,如何分??? 答:太奇葩的需求!不过还是希望下面实现过程中讲解的思路能帮 ...