[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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...