整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          程序員大神整理的好用工具

          程序員大神整理的好用工具

          術站點

          • Hacker News:非常棒的針對編程的鏈接聚合網站

          • Programming reddit:同上

          • MSDN:微軟相關的官方技術集中地,主要是文檔類

          • infoq:企業級應用,關注軟件開發領域

          • OSChina:開源技術社區,開源方面做的不錯哦

          • cnblogs,51cto,csdn:常見的技術社區,各有專長

          • stackoverflow:IT技術問答網站

          • GitHub:全球最大的源代碼管理平臺,很多知名開源項目都在上面,如Linux內核,

          • OpenStack等免費的it電子書:http://it-ebooks.info/

          • DevStore:開發者服務商店

          不錯的書籍

          • 人件

          • 人月神話

          • 代碼大全2

          • 計算機程序設計藝術

          • 程序員的自我修養

          • 程序員修煉之道

          • 高效能程序員的修煉(成為一名杰出的程序員其實跟寫代碼沒有太大關系)

          • 深入理解計算機系統

          • 軟件隨想錄

          • 算法導論(麻省理工學院出版社)

          • 離線數學及其應用

          • 設計模式

          • 編程之美

          • 黑客與畫家

          • 編程珠璣

          • C++ Prime

          • Effective C++

          • TCP/IP詳解

          • Unix 編程藝術

          • 《精神分析引論》弗洛伊德

          • 搞定:無壓力工作的藝術

          平臺工具(都是開源的好東東哦)

          • Redmine/Trac:項目管理平臺

          • Jenkins/Jira(非開源):持續集成系統(Apache Continuum,這個是Apache下的CI系統,還沒來得及研究)

          • Sonar:代碼質量管理平臺

          • git,svn:源代碼版本控制系統

          • GitLib/Gitorious:構建自己的GitHub服務器

          • gitbook:https://www.gitbook.io/寫書的好東西,當然用來寫文檔也很不錯的

          • Travis-ci:開源項目持續集成必備,和GitHub相結合,https://travis-ci.org/

          • 開源測試工具、社區(Selenium、OpenQA.org)

          • Puppet:一個自動管理引擎,可以適用于Linux、Unix以及Windows平臺。所謂配置管理系統,就是管理機器里面諸如文件、用戶、進程、軟件包這些資源。無論是管理1臺,還是上萬臺機器Puppet都能輕松搞定。

          • Nagios:系統狀態監控報警,還有個Icinga(完全兼容nagios所有的插件,工作原理,配置文件以及方法,幾乎一模一樣。配置簡單,功能強大)

          • Ganglia:分布式監控系統

          • fleet:分布式init系統

          爬蟲相關(好玩的工具)

          • Phantomjs

          • berserkJS(基于Phantomjs的改進版本)

          • SlimerJS

          • CasperJS

          • selenium

          Web 服務器性能/壓力測試工具/負載均衡器

          • http_load: 程序非常小,解壓后也不到100K

          • webbench: 是Linux下的一個網站壓力測試工具,最多可以模擬3萬個并發連接去測試網站的負載能力

          • ab: ab是apache自帶的一款功能強大的測試工具

          • Siege: 一款開源的壓力測試工具,可以根據配置對一個WEB站點進行多用戶的并發訪問,記錄每個用戶所有請求過程的相應時間,并在一定數量的并發訪問下重復進行。

          • squid(前端緩存),nginx(負載),nodejs(沒錯它也可以,自己寫點代碼就能實現高性能的負載均衡器):常用的負載均衡器

          • Piwik:開源網站訪問量統計系統

          • ClickHeat:開源的網站點擊情況熱力圖

          • HAProxy:高性能TCP /HTTP負載均衡器

          • ElasticSearch:搜索引擎基于Lucene

          • Page Speed SDK和YSLOW

          • HAR Viewer: HAR分析工具

          • protractor:E2E(end to end)自動化測試工具

          Web 前端相關

          • GRUNT: js task runner

          • Sea.js: js模塊化

          • knockout.js:MVVM開發前臺,綁定技術

          • Angular.js: 使用超動感HTML & JS開發WEB應用!

          • Highcharts.js,Flot:常用的Web圖表插件

          • Raw:非常不錯的一款高級數據可視化工具

          • Rickshaw:時序圖標庫,可用于構建實時圖表

          • JavaScript InfoVis Toolkit:另一款Web數據可視化插件

          • Pdf.js,在html中展現pdf

          • ACE,CodeMirror:Html代碼編輯器(ACE甚好啊)

          • NProcess:絢麗的加載進度條

          • impress.js:讓你制作出令人眩目的內容展示效果(類似的還有reveal)

          • Threejs:3DWeb庫

          • Hightopo:基于Html5的2D、3D可視化UI庫

          • jQuery.dataTables.js:高度靈活的表格插件

          • Rapha?l:js,canvas繪圖庫,后來發現百度指數的圖形就是用它繪出來的

          • director.js:js路由模塊,前端路由,Nodejs后端路由等,適合構造單頁應用

          • pace.js:頁面加載進度條

          • bower:Web包管理器

          • jsnice:有趣的js反編譯工具,猜壓縮后的變量名 http://www.jsnice.org/

          • D3.js: 是一個基于JavaScript數據展示庫(類似的還有P5.js)

          • Zepto.js:移動端替代jQuery的東東,當然也可以使用jquery-mobile.

          UI框架:Foundation,Boostrap,Pure,EasyUI,Polymer

          前端UI設計師必去的幾個網站:Dribbble,awwwards,unmatchedstyle,UIMaker

          Mozilla 開發者中心:https://developer.mozilla.org/en-US/

          圖標資源:IcoMoon(我的最愛),Themify Icons,FreePik,Glyphiconsart

          • Dialog:非常漂亮的對話框

          • AdminLTE:github上的一個開源項目,基于Boostrap3的后臺管理頁面框架

          • Respond.js:讓不懂愛的IE6-8支持響應式設計

          • require.js: js模塊加載庫

          • select2:比chosen具有更多特性的選擇框替代庫

          • AngularUI:集成angular.js的UI庫

          • normalize.css: 采用了現代化標準讓各瀏覽器渲染出的html保持一致的庫

          • CreateJS:Html5游戲引擎Less,Compass:簡化CSS開發

          • emojify.js:用于自動識別網頁上的Emoji文字并將其顯示為圖像

          • simditor:一個不錯的開源的html編輯器,簡潔高效

          • Sencha: 基于html5的移動端開發框架

          • SuperScrollorama+TweenMax+skrollr:打造超酷的視差滾動效果網頁動畫

          • jquery-smooth-scroll:同上,平滑滾動插件

          • Animate.css:實現了各種動畫效果的css庫

          • Emmet:前端工程師必備,ZenCode的前身

          • MagicDraw:Uml圖工具

          大數據處理/數據分析/分布式工具

          • Hadoop:分布式的文件系統,結合其MapReduce編程模型可以用來做海量數據的批處理(Hive,Pig,HBase啥的就不說了),值得介紹的是Cloudera的Hadoop分支CDH5,基于YARN MRv2集成了Spark可直接用于生產環境的Hadoop,對于企業快速構建數據倉庫非常有用。

          • Ceph:Linux分布式文件系統(特點:無中心)

          • Storm:實時流數據處理,可以看下IBM的一篇介紹 (還有個Yahoo的S4,也是做流數據處理的)

          • Spark:大規模流式數據處理(可以應付企業中常見的三種數據處理場景:復雜的批量數據處理(batch data processing);基于歷史數據的交互式查詢(interactive query);基于實時數據流的數據處理(streaming data processing)),CSND有篇文章介紹的不錯

          • Spark Streaming:基于Spark的實時計算框架

          • Tachyon:分布式內存文件系統

          • Mesos:計算框架一個集群管理器,提供了有效的、跨分布式應用或框架的資源隔離和共享Impala:新一代開源大數據分析引擎,提供Sql語義,比- Hive強在速度上

          • SNAPPY:快速的數據壓縮系統,適用于Hadoop生態系統中

          • Kafka:高吞吐量的分布式消息隊列系統

          • ActiveMQ:是Apache出品,最流行的,能力強勁的開源消息總線

          • MQTT:Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分

          • RabbitMQ:記得OpenStack就是用的這個東西吧

          • ZeroMQ:宣稱是將分布式計算變得更簡單,是個分布式消息隊列,可以看下云風的一篇文章的介紹開源的日志收集系統:scribe、chukwa、kafka、flume。這有一篇對比文章

          • Zookeeper:可靠的分布式協調的開源項目

          • Databus:LinkedIn 實時低延遲數據抓取系統

          數據源獲取:Flume、Google Refine、Needlebase、ScraperWiki、BloomReach

          序列化技術:JSON、BSON、Thrift、Avro、Google Protocol Buffers

          NoSql:Apache Hadoop、Apache Casandra、MongoDB、Apache CouchDB、Redis、BigTable、HBase、Hypertable、Voldemort、Neo4j

          MapReduce相關:Hive、Pig、Cascading、Cascalog、mrjob、Caffeine、S4、MapR、Acunu、Flume、Kafka、Azkaban、Oozie、Greenplum

          數據處理:R、Yahoo! Pipes、Mechanical Turk、Solr/ Lucene、ElasticSearch、Datameer、Bigsheets、TinkerpopNLP自然語言處理:Natural Language Toolkit、Apache OpenNLP、Boilerpipe、OpenCalais

          機器學習:WEKA、Mahout、scikits.learn、SkyTree

          可視化技術:GraphViz、Processing、Protovis、Google Fusion Tables、Tableau、Highcharts、EChats(百度的還不錯)、Rapha?l.js

          • Kettle:開源的ETL工具

          • Pentaho:以工作流為核心的開源BI系統

          • Mondrian:開源的Rolap服務器

          • Oozie:開源hadoop的工作流調度引擎

          開源的數據分析可視化工具:Weka、Orange、KNIME

          Cobar:阿里巴巴的MySql分布式中間件

          C & C++

          Thrift:用來進行可擴展且跨語言的服務的開發(類似的還有個Avro,Google protobuf)。

          libevent:是一個事件觸發的網絡庫,適用于windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統調用管理事件機制。(對了還有個libev呢)

          Boost:不多說了,準C++標準庫

          Ptmalloc\Valgrind\Purify

          NetworkServer架構:acceptor->dispatcher->worker(這個不算工具哦)

          breakpad:崩潰轉儲和分析模塊,很多crashreport會用到

          UI界面相關:MFC、BCG和QT這類的就不說了,高端一點的還有Html和DirectUI技術:libcef(基于chrome內核的,想想使用html5開發頁面,還真有點小激動呢)、HtmlLayout、Duilib、Bolt,非C++的,還有node-webkit也不錯,集成了node和webkit內核。

          游戲開發相關

          MINA:使用Java開發手游和頁游服務器(對了還有Netty,也很猛的,都是基于NIO的)

          HP-Socket:見有有些頁游服務器使用這個構建的

          云風的技術博客:http://blog.codingnow.com/

          OGRE:大名鼎鼎的3D圖形渲染引擎

          OpenVDB:夢工廠C++的特效庫,開源的

          cocos2d:跨平臺2D游戲引擎

          unity3d:跨平臺3D游戲引擎,很火的哦

          Nodejs:也有不少使用它來開發手游和也有服務器(網易的Pomelo就是哦)

          日志聚合,分布式日志收集

          Scribe:Facebook的(nodejs + scribe + inotify 同步日志)

          logstash:強大的日志收集系統,可以基于logstash+kibana+elasticsearch+redis開發強大的日志分析平臺

          log.io: nodejs開發的實時日志收集系統

          RTP,實時傳輸協議與音視頻

          RTP,RTCP,RTSP-> librtp,JRTPLIB(遵循了RFC1889標準)

          環形緩沖區,實時數據傳輸用

          SDL,ffmpeg,live555,Speex

          Red5:用Java開發開源的Flash流媒體服務器。它支持:把音頻(MP3)和視頻(FLV)轉換成播放流; 錄制客戶端播放流(只支持FLV);共享對象;現場直播流發布;遠程調用。

          Python

          Eric,Eclipse+pydev,比較不錯的Python IDE

          PyWin:Win32 api編程包

          numpy:科學計算包,主要用來處理大型矩陣計算等,此外還有SciPy,Matplotlib

          GUI相關:PyQt,PyQwt

          supervisor:進程監控工具

          Java相關

          常用的IDE:IntelliJ IDEA,Eclipse,Netbeans

          Web開發相關:Tomcat、Resin、Jetty、WebLogic等,常用的組件Struts,Spring

          HibernateNetty: 異步事件驅動網絡應用編程框架,用于高并發網絡編程比較好(NIO框架)

          MINA:簡單地開發高性能和高可靠性的網絡應用程序(也是個NIO框架),不少手游服務端是用它開發的

          jOOQ:java Orm框架Activiti:工作流引擎,類似的還有jBPM、Snaker

          Perfuse:是一個用戶界面包用來把有結構與無結構數據以具有交互性的可視化圖形展示出來.

          Gephi:復雜網絡分析軟件, 其主要用于各種網絡和復雜系統,動態和分層圖的交互可視化與探測開源工具

          Nutch:知名的爬蟲項目,hadoop就是從這個項目中發展出來的

          web-harvest:Web數據提取工具

          POM工具:Maven+ArtifactoryNetflix

          Curator:Netflix公司開源的一個Zookeeper client library,用于簡化Zookeeper客戶端編程

          Akka:一款基于actor模型實現的 并發處理框架

          EclEmma:覆蓋測試工具

          .net相關

          Xilium.CefGlue:基于CEF框架的.NET封裝,基于.NET開發Chrome內核瀏覽器

          CefSharp:同上,有一款WebKit的封裝,C#和Js交互會更簡單

          netz:免費的 .NET 可執行文件壓縮工具

          SmartAssembly:變態的.net代碼優化混淆工具

          NETDeob0:.net反混淆工具,真是魔高一尺道高一丈啊(還有個de4dot,在GitHub上,都是開源的)

          ILMerge:將所有引用的DLL和exe文件打成一個exe文件

          ILSpy:開源.net程序反編譯工具

          Javascript.NET:很不錯的js執行引擎,對v8做了封裝

          NPOI: Excel操作

          DotRAS:遠程訪問服務的模塊

          WinHtmlEditor: Winform下的html編輯器

          SmartThreadPool:使用C#實現的,帶高級特性的線程池

          Snoop: WPF Spy Utility

          Autofac: 輕量級IoC框架

          HtmlAgilityPack:Html解析利器

          Quartz.NET:Job調度

          HttpLib:@CodePlex,簡化http請求

          SuperSocket:簡化Socket操作,基于他的還有個SuperWebSocket,可以開發獨立的WebSocket服務器了

          DocX:未安裝Office的情況下操作Word文件

          Dapper:輕量級的ORM類,性能不錯

          HubbleDotNet:支持接入數據庫的全文搜索系統

          fastJSON:@CodeProject,高性能的json序列化類

          ZXing.NET:@CodePlex,QR,條形碼相關

          Nancy:輕量級Http服務器,做個小型的Web應用可以擺脫IIS嘍(Nancy.Viewengines.Razor,可以加入Razor引擎)

          AntiXSS:微軟的XSS防御庫Microsoft Web Protection

          LibraryJint:JavaScript解釋器

          CS-Script:將C#代碼文件作為腳本執行

          Jexus:Linux下 高性能、易用、免費的ASP.NET服務器

          Clay:將dynamic發揮的更加靈活,像寫js一樣寫C#

          DynamicJSON:不必定義數據模型獲取json數據

          Antlr:開源的語法分析器(歸到C#不太合適,其他語言也可以去用)

          SharpPcap:C#版的WinPcap調用端,牛逼的網絡包分析庫(自帶PacketNotNet用于包協議分析)

          Roslyn:C#,VB編譯器

          ImageResizer: 服務端自由控制圖片大小,真乃神器也,對手機端傳小圖,PC端傳大圖,CMS用它很方便

          UI相關:DevExpress, Fluent(Office 07風格), mui(Modern UI for WPF)

          NetSparkle:應用自動更新組件

          ConfuserEx: 開源.net混淆工具

          ServiceStack: 開源高性能Web服務框架,可用于構建高性能的REST服務Expression

          Evaluator:Eval for C#,處理字符串表達式

          http://nugetmusthaves.com/

          常用工具

          • Fiddler:非常好用的Web前端調試工具,當然是針對底層http協議的,一般情況使用Chrome等自帶的調試工具也足夠了,特殊情況還得用它去處理

          • wireshark:知名的網絡數據包分析工具

          • PowerCmd:替代Windows Cmd的利器

          • RegexBuddy:強大的正則表達式測試工具

          • Soure Insight:源代碼閱讀神器

          • SublimeText:程序員最愛的編輯器

          • Database.NET:一個通用的關系型數據庫客戶端,基于.NET 4.0開發的,做簡單的處理還是蠻方便的

          • Navicat Premium:支持MySql、PostgreSQL、Oracle、Sqlite和SQL Server的客戶端,通用性上不如Database.NET,但性能方面比Database.NET好很多,自帶備份功能也用于數據庫定時備份。

          • Synergy : 局域網內一套鍵盤鼠標控制多臺電腦

          • DameWare:遠程協助工具集(我在公司主要控制大屏幕用)

          • Radmin: 遠程控制工具,用了一段時間的

          • DameWare,還要破解,對Win7支持的不好,還是發現這個好用

          • Listary:能極大幅度提高你 Windows 文件瀏覽與搜索速度效率的「超級神器」

          • Clover:給資源管理器加上多標簽

          • WinLaunch:模擬Mac OS的Launch工具

          • Fritzing:繪制電路圖

          • LICEcap:gif教程制作git,

          • svn:版本控制系統Enigma Virtual Box(將exe,dll等封裝成一個可執行程序)

          • Open DBDiff(針對SqlServer)數據庫同步

          • SymmetricDS:數據庫同步

          • BIEE,Infomatica,SPSS,weka,R語言:數據分析

          • CodeSmith,LightSwitch:代碼生成

          • Pandoc:Markdown轉換工具,出書用的。以前玩過docbook,不過現在還是Markdown盛行啊。

          • Window Magnet[Mac]:增強Mac窗口管理功能,想Win7一樣具有窗口拖放到屏幕邊緣自動調整的功能

          • log explorer:查看SqlServer日志dependency

          • walker:查詢Windows應用程序dll依賴項

          • Shairport4w:將iPhone,iPad,iPod上的音頻通過AirPlay協議傳輸到PC上

          • ngrok:內網穿透工具Axure:快速原型制作工具,還有個在線作圖的工具國內的一個創業團隊做的,用著很不錯 http://www.processon.com

          • tinyproxy:(Linux)小型的代理服務器支持http和https協議EaseUS Partition

          • Master:超級簡單的分區調整工具,速度還是蠻快的,C盤不夠用了就用它從D盤劃點空間吧,不用重裝系統這么折騰哦。

          • CheatEngine:玩游戲修改內存值必備神器(記得我在玩軒轅劍6的時候就用的它,超級方便呢)

          • ApkIDE:Android反編譯神器翻、墻工具(自|由|門、天行瀏覽器)

          最后推薦下我的Android學習群:110359956,不管你是小白還是大牛,小編我都挺歡迎,不定期分享干貨,包括我自己整理的一份2017最新的Android學習資料和零基礎入門教程,送給大家,歡迎初學和進階中的小伙伴。還有最新opengl,opencv,VR,AR技術防止兩年至三年之后的一批大篩選。

          還有MVP最新教程實訓班,歡迎大家加入

          近刷臉支付很火,老板們當然要追趕時代潮流,于是就有了刷臉支付這個項目。前端實現關鍵的技術是攝像頭錄像拍照人臉比對,本文來探討一下如何在html5環境中如何實現刷臉支付以及開發過程中遇到的問題。

          1.攝像頭

          1.1 input獲取攝像頭

          html5中獲取手機上的圖片,有兩種方式,使用input,如下可以打開攝像頭拍照:

          <input type="file" capture="camera" accept="image/*"/>

          另外如果想打開相冊,可以這樣:

          <input type="file" accept="img/*">

          但是這兩種方式都會有兼容性問題,用過的同學可能都知道。

          1.2 getUserMedia獲取攝像頭

          getUserMedia是html5一個新的api,官方一點的定義是:

          MediaDevices.getUserMedia() 會提示用戶給予使用媒體輸入的許可,媒體輸入會產生一個MediaStream,里面包含了請求的媒體類型的軌道。此流可以包含一個視頻軌道(來自硬件或者虛擬視頻源,比如相機、視頻采集設備和屏幕共享服務等等)、一個音頻軌道(同樣來自硬件或虛擬音頻源,比如麥克風、A/D轉換器等等),也可能是其它軌道類型。

          簡單一點說就是可以獲取到用戶攝像頭。

          同上面input一樣,這種方式也有兼容性問題,不過可以使用其他方式解決,這里可以參考MediaDevices.getUserMedia(),文檔中有介紹"在舊的瀏覽器中使用新的API"。我這里在網上也找了一些參考,總結出一個相對全面的getUserMedia版本,代碼如下:

          // 訪問用戶媒體設備
          getUserMedia(constrains, success, error) {
              if (navigator.mediaDevices.getUserMedia) {
                  //最新標準API
                  navigator.mediaDevices.getUserMedia(constrains).then(success).catch(error);
              } else if (navigator.webkitGetUserMedia) {
                  //webkit內核瀏覽器
                  navigator.webkitGetUserMedia(constrains).then(success).catch(error);
              } else if (navigator.mozGetUserMedia) {
                  //Firefox瀏覽器
                  navagator.mozGetUserMedia(constrains).then(success).catch(error);
              } else if (navigator.getUserMedia) {
                  //舊版API
                  navigator.getUserMedia(constrains).then(success).catch(error);
              } else {
                  this.scanTip="你的瀏覽器不支持訪問用戶媒體設備"
              }
          }

          1.3 播放視屏

          獲取設備方法有兩個回調函數,一個是成功,一個是失敗。成功了就開始播放視頻,播放視屏其實就是給video設置一個url,并調用play方法,這里設置url要考慮不同瀏覽器兼容性,代碼如下:

          success(stream) {
              this.streamIns=stream
              // 設置播放地址,webkit內核瀏覽器
              this.URL=window.URL || window.webkitURL
              if ("srcObject" in this.$refs.refVideo) {
                  this.$refs.refVideo.srcObject=stream
              } else {
                  this.$refs.refVideo.src=this.URL.createObjectURL(stream)
              }
              this.$refs.refVideo.onloadedmetadata=e=> {
                  // 播放視頻
                  this.$refs.refVideo.play()
                  this.initTracker()
              }
          },
          error(e) {
              this.scanTip="訪問用戶媒體失敗" + e.name + "," + e.message
          }

          注意:

          1. 播放視屏方法最好寫在onloadmetadata回調函數中,否則可能會報錯。
          2. 播放視頻的時候出于安全性考慮,必須在本地環境中測試,也就是http://localhost/xxxx中測試,或者帶有https://xxxxx環境中測試,不然的話或有跨域問題。
          3. 下面用到的initTracker()方法也好放在這個onloadedmetadata回調函數里,不然也會報錯。

          2. 捕捉人臉

          2.1 使用tracking.js捕捉人臉

          視屏在video中播放成功之后就開始識別人臉了,這里使用到一個第三方的功能tracking.js,是國外的大神寫的JavaScript圖像識別插件。關鍵代碼如下:

          // 人臉捕捉
          initTracker() {
              this.context=this.$refs.refCanvas.getContext("2d")    // 畫布
              this.tracker=new tracking.ObjectTracker(['face'])     // tracker實例
              this.tracker.setStepSize(1.7)                           // 設置步長
              this.tracker.on('track', this.handleTracked)            // 綁定監聽方法
              try {
                  tracking.track('#video', this.tracker)      // 開始追蹤
              } catch (e) {
                  this.scanTip="訪問用戶媒體失敗,請重試"
              }
          }

          捕獲到人臉之后,可以在頁面上用一個小方框標注出來,這樣有點交互效果。

          // 追蹤事件
          handleTracked(e) {
              if (e.data.length===0) {
                  this.scanTip='未檢測到人臉'
              } else {
                  if (!this.tipFlag) {
                      this.scanTip='檢測成功,正在拍照,請保持不動2秒'
                  }
                  // 1秒后拍照,僅拍一次
                  if (!this.flag) {
                      this.scanTip='拍照中...'
                      this.flag=true
                      this.removePhotoID=setTimeout(()=> {
                          this.tackPhoto()
                          this.tipFlag=true
                      }, 2000)
                  }
                  e.data.forEach(this.plot)
              }
          }

          在頁面中畫一些方框,標識出人臉:

          <div class="rect" v-for="item in profile"
                       :style="{ width: item.width + 'px', height: item.height + 'px', left: item.left + 'px', top: item.top + 'px'}"></div>
          // 繪制跟蹤框
          plot({x, y, width: w, height: h}) {
              // 創建框對象
              this.profile.push({ width: w, height: h, left: x, top: y })
          }

          2.2 拍照

          拍照,就是使用video作為圖片源,在canvas中保存一張圖片下來,注意這里使用toDataURL方法的時候可以設置第二個參數quality,從0到1,0表示圖片比較粗糙,但是文件比較小,1表示品質最好。

          // 拍照
          tackPhoto() {
              this.context.drawImage(this.$refs.refVideo, 0, 0, this.screenSize.width, this.screenSize.height)
              // 保存為base64格式
              this.imgUrl=this.saveAsPNG(this.$refs.refCanvas)
              // this.compare(imgUrl)
              this.close()
          },
          // Base64轉文件
          getBlobBydataURI(dataURI, type) {
              var binary=window.atob(dataURI.split(',')[1]);
              var array=[];
              for(var i=0; i < binary.length; i++) {
                  array.push(binary.charCodeAt(i));
              }
              return new Blob([new Uint8Array(array)], {
                  type: type
              });
          },
          // 保存為png,base64格式圖片
          saveAsPNG(c) {
              return c.toDataURL('image/png', 0.3)
          }

          拍照完成之后就可以把文件發送給后端,讓后端進行對比驗證,這里后端使用的是阿里云的接口。

          3. 最后效果

          3.1 參考代碼demo

          最后,demo我已經放在github上了,感興趣可以打開看一下。

          效果如下:

          3.2 在項目中落地

          最后放在項目中,無非就是最后一個步驟,去調用接口比對,根據比對結果成功是成功還是失敗,決定是人臉支付還是繼續使用原來的密碼支付,效果如下:

          ps:這里人臉比對失敗了,是因為我帶著口罩,就不呲牙露臉了。

          作者:Tyler Ning 出處:http://www.cnblogs.com/tylerdonet/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過以下郵箱地址344805262@qq.com 聯系我,非常感謝。

          TML5為了更好地處理今天的互聯網應用,添加了很多新元素及功能,比如: 圖形的繪制,多媒體內容,更好的頁面結構,更好的形式處理,和幾個api拖放元素,定位,包括網頁應用程序緩存,存儲,網絡工作者等。

          HTML5的<canvas>標簽可以定義圖形,比如圖表和其他圖像。該標簽是基于 JavaScript 的繪圖 API。

          如想完成這樣一個任務,畫一個包含時間軸的世界歷史年表,如下圖所示:

          要完成上述任務,便可以使用HTML5+CSS+JS,代碼如下:

          <!DOCTYPE html>

          <html><title>historyTidePrev</title>

          <style type="text/css">

          .left{/*total 974,豎線起始位置:436px*/

          width:350px;

          float:left;

          padding-left:56px;

          padding-right:30px;

          }

          .right{/*豎線起始位置:436px*/

          width:500px;

          float:left;

          padding-left:38px;

          }

          p{

          line-height:16px;

          margin:0;

          padding:0;

          text-indent:-2em;

          }

          </style>

          <script>

          function scrol...(){

          var scl=document.body.scrollHeight/2+30*14;

          window.scrollBy(0,scl);

          }

          </script>

          <canvas id="myCanvas2" width="974" height="29418" style="border:0px solid #d3d3d3;">

          Your browser does not support the HTML5 canvas tag.

          </canvas>

          <script>

          var c=document.getElementById("myCanvas2");

          var ctx=c.getContext("2d");

          var canvasW=974;

          var dingJiange=18; //頂端間隔 豎線起始位置(Y軸)

          var diJiange=0; //底部間隔 豎線起始位置(Y軸)

          var jianGe=dingJiange+diJiange;

          var Xcor=436; //豎線X坐標的起始位置;

          //因最小的字體需要12它,所以下面的定位需要達到12;

          var nianPX=14; //一年間隔使用的像素;

          var nianYprev=2100; //公元前有多少年開始

          var nianYnex=0;//公元前后多少年結束

          var nianYprevPx=nianYprev*nianPX; //公元前有多少年及像素;

          var nianYnexPx=nianYnex*nianPX; //公元后有多少年及像素;

          var Ycor=nianYprevPx+nianYnexPx; //豎線Y坐標的終點位置(長度);

          var nianL=8; //年線段的長度;

          var nianL10=20; //10年線段的長度;

          var nianL100=30; //100年線段的長度;

          var fontsi=nianPX*3;//字體大小

          var fontsi10=nianPX*4;

          var fontsi100=nianPX*5;

          //長豎線

          ctx.beginPath();

          ctx.moveTo(Xcor,dingJiange);

          ctx.lineTo(Xcor,Ycor+diJiange);

          ctx.stroke();

          //年橫線

          for(i=dingJiange;i<=Ycor+diJiange;i+=nianPX){

          ctx.beginPath();

          ctx.moveTo(Xcor,i);

          ctx.lineTo(Xcor-nianL,i);

          ctx.strokeStyle="rgba(0, 0, 0, 0.4)";

          ctx.stroke();

          }

          //5年橫線

          for(i=dingJiange;i<=Ycor+jianGe;i+=nianPX*5){

          ctx.beginPath();

          ctx.moveTo(Xcor,i);

          ctx.lineTo(Xcor-nianL*1.5,i);

          ctx.strokeStyle="rgba(0, 0, 0, 0.6)";

          ctx.stroke();

          }

          //10年橫線和文本

          for(i=dingJiange;i<=Ycor+jianGe;i+=nianPX*10){

          ctx.beginPath();

          ctx.moveTo(Xcor,i);

          ctx.lineTo(Xcor-nianL*2,i);

          ctx.strokeStyle="rgba(0, 0, 0, 0.8)";

          ctx.stroke();

          ctx.textAlign="right";

          var varmid=(i-dingJiange)/nianPX;

          if(varmid%100!=0){

          ctx.font="12px 宋體"; //30px 可以寫在里面

          // Create gradient

          var gradient=ctx.createLinearGradient(0,0,c.width,0);

          gradient.addColorStop("0","magenta");

          gradient.addColorStop("0.5","blue");

          gradient.addColorStop("1.0","red");

          // Fill with gradient

          ctx.fillStyle=gradient;

          ctx.fillText((i-dingJiange)/nianPX-nianYprev,Xcor-nianL*2,i+6);

          }

          }

          //100年橫線和文本

          for(i=dingJiange;i<=Ycor+jianGe;i+=nianPX*100){

          ctx.beginPath();

          ctx.moveTo(Xcor,i);

          ctx.lineTo(Xcor-nianL*3,i);

          ctx.strokeStyle="rgba(0, 0, 0, 0.9)";

          ctx.stroke();

          ctx.textAlign="right";

          ctx.font="18px 宋體"; //30px 可以寫在里面

          // Create gradient

          var gradient=ctx.createLinearGradient(0,0,c.width,0);

          gradient.addColorStop("0","magenta");

          gradient.addColorStop("0.5","blue");

          gradient.addColorStop("1.0","red");

          // Fill with gradient

          ctx.strokeStyle=gradient;

          ctx.strokeText((i-dingJiange)/nianPX-nianYprev,Xcor-nianL*3,i+8);

          }

          function txtL(year0,txt){

          var xc=Xcor-nianL-65; //左邊的線條從右邊開始到左邊結束的位置;

          var xc2=10;//左邊文本從左邊開始的位置;

          var yp;

          if(year0>=0){

          yp=dingJiange+nianYprevPx+year0*nianPX;

          txt="" + year0 + "年," + txt;

          }else{

          yp=dingJiange+nianYprevPx+year0*nianPX;

          yearp=year0*(-1);

          txt="前" + yearp + "年," + txt;

          }

          ctx.fillStyle="#00f";

          ctx.beginPath();

          ctx.moveTo(Xcor-60,yp);

          ctx.lineTo(xc+xc2-25,yp);

          ctx.stroke();

          ctx.font="12px Verdana";

          ctx.fillStyle="#000";

          ctx.textAlign="left";

          //xc的位置是xc=Xcor+nianL100=974-436-30=508,可以容納46個12px的字符(44*12=535);

          var txtN;//右邊屏幕可容納字符串個數;

          var txtW=12*1;//手工算出是0.945;txtW是一個字符串的寬度;

          txtN=Math.floor(xc/txtW);

          if(txt.length>txtN){

          var fortime=Math.ceil(txt.length/txtN);//需要循環的次數;

          ctx.fillText(txt.substring(0,txtN),xc2,yp);

          for(i=0;i<fortime;i++){

          yp=yp+14;

          txt=txt.substring(txtN);

          var txt2=" "+txt.substring(0,txtN);

          ctx.fillText(txt2,xc2,yp);

          }

          }else{

          ctx.fillText(txt,xc2,yp);

          }

          }

          function txtR(year0,txt){

          var xc=Xcor+nianL100;

          var yp;

          if(year0>=0){

          yp=dingJiange+nianYprevPx+year0*nianPX;

          txt="" + year0 + "年," + txt;

          }else{

          yp=dingJiange+nianYprevPx+year0*nianPX;

          yearp=year0*(-1);

          txt="前" + yearp + "年," + txt;

          }

          ctx.fillStyle="#00f";

          ctx.beginPath();

          ctx.moveTo(Xcor+3,yp);

          ctx.lineTo(xc,yp);

          ctx.stroke();

          ctx.font="12px Verdana";

          ctx.fillStyle="#000";

          ctx.textAlign="left";

          //xc的位置是xc=Xcor+nianL100=974-436-30=508,可以容納46個12px的字符(44*12=535);

          var txtN;//右邊屏幕可容納字符串個數;

          var txtW=12*1;//手工算出是0.945;txtW是一個字符串的寬度;

          txtN=Math.floor((canvasW-xc)/txtW);

          if(txt.length>txtN){

          var fortime=Math.ceil(txt.length/txtN);//需要循環的次數;

          ctx.fillText(txt.substring(0,txtN-4),xc,yp);

          for(i=0;i<fortime;i++){

          yp=yp+14;

          txt=txt.substring(txtN-4);

          var txt2=" "+txt.substring(0,txtN-4);

          ctx.fillText(txt2,xc,yp);

          }

          }else{

          ctx.fillText(txt,xc,yp);

          }

          }

          txtR(-580,"畢達哥拉斯(約-580~-500年)古希臘數學家、哲學家創立畢達哥拉斯學派,提出畢達哥拉斯定理、數和諧說和靈魂輪回說。");

          txtR(-563,"釋迦牟尼約-563~前483年佛教創始人建立了完整的佛教教義學說。");

          txtL(-551,"孔子-551.9.28--479.4.11,春秋時期魯國人.");

          txtR(-552,"孫武齊國樂安人,漢族.公元前527年,年僅25歲的孫武完成曠世圣書——《孫子兵法》。");

          txtR(-427,"公元前427~前348/347)年古希臘哲學家柏拉圖創立“學園派”,建立以“理念論”為核心的客觀唯心主義哲學體系。");

          txtR(-384,"前4世紀,希臘亞里士多德(公元前384年-公元前322年)對數學、動物學等進行綜合研究。");

          txtR(-0,"");

          txtR(-0,"");

          </script>

          </body>

          </html>


          主站蜘蛛池模板: 日韩人妻一区二区三区免费| 中文字幕一区二区三区乱码| 水蜜桃av无码一区二区| a级午夜毛片免费一区二区| 久久久久久免费一区二区三区| 天堂资源中文最新版在线一区 | 国产精品福利区一区二区三区四区| 日韩精品一区二区三区中文字幕 | 国产精品无圣光一区二区| 麻豆一区二区在我观看| 日本一区二区三区精品视频| 狠狠爱无码一区二区三区| 国产一区二区三区在线2021 | 免费无码一区二区三区| 亚洲日韩一区二区一无码| 精彩视频一区二区| 乱精品一区字幕二区| 国产一区二区视频免费| 久久久久无码国产精品一区| 国产一区二区在线观看视频| 无码视频一区二区三区在线观看| 国产乱码精品一区二区三区麻豆| 国产午夜三级一区二区三| 亚洲欧美日韩中文字幕一区二区三区| 国产vr一区二区在线观看| 国产成人亚洲综合一区| 中文字幕一区日韩在线视频| 欧美人妻一区黄a片| 无码国产精成人午夜视频一区二区| 四虎成人精品一区二区免费网站 | 国产精品一区二区久久乐下载| 国产福利视频一区二区| 日本免费一区尤物| 美女毛片一区二区三区四区| 亚洲日本一区二区三区在线不卡| 91精品福利一区二区| 精品一区二区久久| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久人妻一区精品性色av| 国产欧美色一区二区三区| 一区二区乱子伦在线播放|