vue中使用帶隱藏文本信息的圖片、圖片水印

来源:https://www.cnblogs.com/gzlt/archive/2020/04/22/12750438.html
-Advertisement-
Play Games

一.帶隱藏文本信息的圖片 通過RGB 分量值的小量變動,不影響對圖片的識別。因此,我們可以在圖片加入文字信息。 最終達到如下效果: 首先,在該組件中加入img用於顯示圖片 1 <canvas ref="canvas" v-show="0"></canvas> 2 <img :src="imageUr ...


一.帶隱藏文本信息的圖片

通過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 = base64Url
42 }

參考

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一步 (添加後臺刪除地址) 打開 ueditor/net/config.json 添加參數 /* 上傳圖片配置項 */ 'imageDelUrl' : '/Admin/Home/DelPic', //線上圖片管理刪除操作請求url //這一行是添加的 "imageActionName": "upl ...
  • 作者:凹凸曼 Manjiz Atom 是什麼?Atom 是集結業內各色資深電商行業設計師,提供一站式專業智能頁面和小程式設計服務的平臺。經過 2 年緊湊迭代,項目越來越龐大,需求不斷變更優化,內部邏輯錯綜複雜,維護成本急劇拉升。同時,Atom 將要承載的業務越來越多,要向更多的內部用戶和商家提供服務 ...
  • 使用hugo這個插件進行hugo博客的搭建,採用zzo的博客主題,基於github以及其action搭建一個靜態博客! ...
  • JavaScript獲取當前時間: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0" ...
  • 京東服務覆蓋 10 億多用戶和超過 27 萬第三方商家。如何連接京東和商家生態體系,給 C 端消費者提供全鏈路一站式的優質服務體驗,是京東高度關註的問題。 因此京東小程式開放平臺作為京東戰略項目應運而生,4 月 22 號正式對外發佈,致力於給消費者帶來 新服務、新體驗。 京東小程式平臺不僅支持存量自 ...
  • 一,滑鼠拖拽事件 考察了滑鼠按下事件mousedown,滑鼠移動事件mousemove,滑鼠彈起事件mouseup,偏移事件offset。代碼如下 <style type="text/css"> *{ margin: 0; padding: 0; } .f_div{ width: 60px; hei ...
  • 網上關於執行上下文的文章有很多,關於什麼是執行上下文,很多文章說得很清晰。 我說一下自己的理解。 執行上下文包含三個東西: 1. VO 2. this 3. [[scope]] 為什麼包含這三個東西呢?首先我們要明白,什麼叫做執行上下文。 執行上下文,又叫做執行環境。那麼,什麼是環境呢? 維基百科是 ...
  • 1.對數組打亂順序 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...