1. 程式人生 > 程式設計 >vue中使用帶隱藏文字資訊的圖片、圖片水印的方法

vue中使用帶隱藏文字資訊的圖片、圖片水印的方法

一.帶隱藏文字資訊的圖片

通過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,ctxWidth,ctxHeight);
    this.imageUrl = this.mergeData(textData.data,'R',ctxHeight);19    }

把文字和圖片整合成一張圖

mergeData(newData,color,width,height) {
    let img = this.img
    this.ctx.drawImage(img,height);
    this.originalData = this.ctx.getImageData(0,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);
    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);
    this.imageUrl = this.canvas.toDataURL();
   },

二.圖片水印

watermark({
    content = '',container = '',width = '',position = 'bottom-right',font = '16px 微軟雅黑',fillStyle = 'rgba(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,ctxHeight);
    ctx.shadowColor = 'rgba(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 隱藏文字資訊圖片水印內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!