[canvas,js,fileAPI]圖片轉文字

来源:http://www.cnblogs.com/wangxinsheng/archive/2017/02/02/6359942.html
-Advertisement-
Play Games

語言:javascript API及元素:canvas,file API 讀取圖片像素值,變化為灰度,根據畫面設定,替換為文字顯示 效果圖【福字】: ...


語言:javascript

API及元素:canvas,file API

讀取圖片像素值,變化為灰度,根據畫面設定,替換為文字顯示

---

效果圖【福字】:

猜猜下麵是什麼:

【金雞】

原圖:

繼續猜猜:

源碼非常簡單:

  1 <html>
  2 <head>
  3 <title>pic2Str</title>
  4 <script src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.js"></script>
  5 <style>
  6 .floatLeft{float:left;}
  7 .clear{clear:both;}
  8 input[type=number]{width:50px;}
  9 </style>
 10 </head>
 11 <body>
 12 <div>
 13     <p><input type="file" id='fileInput' accept="image/*" /></p>
 14     <p>
 15         灰度範圍 [深色] :<input type="number" min="0" max="255" value='0' id='rgb1f' />
 16          - 
 17          <input type="number" maxlength="3" value='120' id='rgb1t' />
 18           : 
 19           替換文字:<input type="text" size="1" maxlength="1" value='9' id='rgb1s' />
 20     </p>
 21     <p>
 22         灰度範圍[普通色]:<input type="number" min="0" max="255" value='120' id='rgb2f' />
 23          - 
 24          <input type="number" maxlength="3" value='200' id='rgb2t' />
 25           : 
 26           替換文字:<input type="text" size="1" maxlength="1" value='0' id='rgb2s' />
 27     </p>
 28     <p>
 29         灰度範圍 [淺色] :<input type="number" min="0" max="255" value='200' id='rgb3f' />
 30          - 
 31          <input type="number" maxlength="3" value='255' id='rgb3t' />
 32           : 
 33           替換文字:<input type="text" size="1" maxlength="1" value='1' id='rgb3s' />
 34     </p>
 35     <p>
 36         一文字橫向跨度<input type="number" min="0" max="100" value='2' id='wpx' />
 37          - 
 38         一文字縱向跨度<input type="number" min="0" max="100" value='2' id='hpx' />
 39     </p>
 40 </div>
 41 <div><input type="button" value="pic2Str" onclick="pic2Str()" /></div>
 42 <div><img style="display:none" id='img' /></div>
 43 <div><canvas style="display:none" id='canvas' ></canvas></div>
 44 <div id='pic2Str'></div>
 45 
 46 
 47 <script>
 48 var hasFile = false;
 49 $(function(){
 50     // bind file change event to load the image file
 51     var fileInput = document.getElementById("fileInput");
 52     fileInput.addEventListener('change', function(event) {
 53         var file = fileInput.files[0];
 54         var imageType = /^image\//;
 55         if ( !imageType.test(file.type) ) {
 56             alert('file type error: ' + file.type +'(image excepted)');
 57             return;
 58         }
 59         var img = document.getElementById("img");
 60         img.file = file;
 61         // 讀取File對象中的內容
 62         var reader = new FileReader();
 63         reader.onload = (function(aImg) { 
 64             return function(e) {
 65                 aImg.src = e.target.result; 
 66                 $("#canvas").css({width:aImg.width+'px',height:aImg.height+'px'});
 67                 $("#canvas").attr('width',aImg.width);
 68                 $("#canvas").attr('height',aImg.height);
 69                 var c=document.getElementById("canvas");
 70                 var ctx=c.getContext("2d");
 71                 ctx.drawImage(aImg,0,0);
 72                 hasFile = true;
 73             }; 
 74         })(img);
 75         reader.readAsDataURL(file);
 76     }, false);
 77 });
 78 function pic2Str(){
 79     var wpx = $("#wpx").val();
 80     var hpx = $("#hpx").val();
 81     var rgb1f = $("#rgb1f").val();
 82     var rgb1t = $("#rgb1t").val();
 83     var rgb1s = $("#rgb1s").val();
 84     var rgb2f = $("#rgb2f").val();
 85     var rgb2t = $("#rgb2t").val();
 86     var rgb2s = $("#rgb2s").val();
 87     var rgb3f = $("#rgb3f").val();
 88     var rgb3t = $("#rgb3t").val();
 89     var rgb3s = $("#rgb3s").val();
 90     if(!hasFile)
 91         return;
 92     if(wpx=='' || hpx=='')
 93         return;
 94     var c=document.getElementById("canvas");
 95     var ctx=c.getContext("2d");
 96     var imgData=ctx.getImageData(0,0,c.width,c.height);
 97     var wi = Math.floor( imgData.width / wpx);
 98     var hi = Math.floor( imgData.height / hpx);
 99     var strRst = [];
100     for(var i = 0;i<hi;i++){
101         var strRow = "";
102         for(var j = 0;j<wi;j++){
103             var rgbAvg = 0;
104             for(var h=0;h<hpx;h++){
105                 for(var l=0;l<wpx;l++){
106                     var min = Math.min(imgData.data[(i*hpx+h)*4*imgData.width+(j*wpx*4+l)]
107                         , imgData.data[(i*hpx+h)*4*imgData.width+(j*wpx*4+l)+1]
108                         , imgData.data[(i*hpx+h)*4*imgData.width+(j*wpx*4+l)+2]);
109                     var max = Math.max(imgData.data[(i*hpx+h)*4*imgData.width+(j*wpx*4+l)]
110                         , imgData.data[(i*hpx+h)*4*imgData.width+(j*wpx*4+l)+1]
111                         , imgData.data[(i*hpx+h)*4*imgData.width+(j*wpx*4+l)+2]);
112                     rgbAvg += (min+max)*0.5;
113                 }
114             }
115             rgbAvg = rgbAvg / (hpx*wpx);
116             if(rgbAvg>=rgb1f && rgbAvg<rgb1t){
117                 strRow += ''+ rgb1s;
118             }else if(rgbAvg>=rgb2f && rgbAvg<rgb2t){
119                 strRow += ''+rgb2s;
120             }else if(rgbAvg>=rgb3f && rgbAvg<=rgb3t){
121                 strRow += ''+rgb3s;
122             }else{
123                 strRow += "&nbsp;";
124             }
125         }
126         strRst.push(strRow);
127     }
128     strRstHtml = "";
129     for(var x = 0;x<strRst.length;x++)
130         strRstHtml += strRst[x] + '<br/>'
131     $("#pic2Str").html(strRstHtml);
132 }
133 </script>
134 </body>
135 </html>

 


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

-Advertisement-
Play Games
更多相關文章
  • ddd小白,一篇章節便能激起了心中漣漪,感慨之初,記於筆下。 第1章 消化知識 用醍醐灌頂、茅塞頓開來形容此章短短的文字,實不為過。 簡單介紹背景:旅游互聯網,B2B,初創公司。產品設計-代碼開發的銜接有過兩種明顯形式: 1. 項目的推進由產品部起頭,收集、分析、過濾需求,形成原型文檔(word,e ...
  • 代理模式在java中的使用,包括靜態代理和動態代理,對retrofit進行模擬 ...
  • 開發框架要考慮的面太多了:安全、穩定、性能、效率、擴展、整潔,還要經得起實踐的考驗,從零開發一個可用的框架,是很耗時費神的工作。網上很多開源的框架,為何還要自己開發?我是基於以下兩點: 1. 沒找到合適的:安全、穩定、簡單、易用、高效、免費; 2. 想成為架構師; 於是就自己動手,參考網上開源的項目 ...
  • ICO (input current optimizer) 手機接上 adapter 後, 手機裡的 charger IC bq25896 開始向 adapter 抽取 current 供給 battery 充電 及 系統消耗,( 這裡的電路圖是假設 adapter 直接接到 charger IC ...
  • 上海修剪園林之風,始於明代。嘉靖三十八年,又有幾處破土動工。 申家祖上並無淵源,到了這一代,長子當過一任太守,卸任回家,造了座園林“萬竹村”。弟弟申明世喜中進士,哥哥在申家地盤上為他另建一個園子。此處用佃戶種桃,桃花爛漫,名“天香園”。園子尚未建成,明世拜別父母兄長與一妻一妾,帶著新娶的小妾去江西赴 ...
  • 有時候因為種種原因導致我們會寫出很多醜陋的代碼,比如趕工時,短暫性的偷懶,不會設計模式等等導致代碼沉積,一個cs上萬行代碼這樣場景是有發生, 當然這裡也包括我。。。所以時間充裕一點之後就想重構一下,畢竟項目中的需求是不斷變更的,面對需求變更,儘量做到最低限度的修改代碼,最大化的擴充 新代碼,還有一點 ...
  • 前言 陸陸續續間間隔隔開發公司簡訊平臺介面已經一段時間了,在年末的時候找個空閑把覺得實際可行的東西記錄下來。 想了想,感覺這東西應該沒啥好說的,但是又覺得哪裡需要記一記,以後換個工作環境,還來一發呢,不就可以避免不必要的坑。 畢竟在實現簡訊介面的過程中,看似簡單,但是有許多需要註意的地方和可以一步到 ...
  • zSass 是自己整理的一個 sass 庫,參考了 sassCore。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...