zoukankan      html  css  js  c++  java
  • [canvas,js,fileAPI]图片转文字

    语言: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]{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({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>
  • 相关阅读:
    点击图片跳转详情
    offsetwidth/clientwidth的区别
    css中让元素隐藏的多种方法
    js中的||、&&与!用法
    怎么区分静态网页和动态网页
    我的第一篇博客--新手勿喷
    2015腾讯暑期实习生面试
    ring0 与 ring3 层之间的交互
    驱动层得到进程的完整路径
    WinDbg调试流程的学习及对TP反调试的探索
  • 原文地址:https://www.cnblogs.com/wangxinsheng/p/6359942.html
Copyright © 2011-2022 走看看