每天掃二維碼的你,真的了解它嗎?

2021-12-22 程式設計師零距離


本文內容與技術關係不大,純粹是一個簡單的分享,內容主要是二維碼的設計原理以及一些有趣的擴展,感興趣的同學可以繼續往下看~

二維碼原理優點

二維碼出現之前,在需要使用類似編碼的場景時,採用的都是一維碼(條形碼);但是條形碼承載的信息太少,只能用於一些很簡單的場景,因此條形碼除了用於商品等信息,並沒有廣泛流行。

二維碼具有以下優點:

高密度編碼,信息容量大:可容納多達 1850 個大寫字母或 2710 個數字或 1108 個字節,或 500 多個漢字,比普通條碼信息容量約高几十倍。編碼範圍廣:該條碼可以把圖片、聲音、文字、籤字、指紋等可以數位化的信息進行編碼,用條碼表示出來;可以表示多種語言文字;可表示圖像數據。容錯能力強,具有糾錯功能:這使得二維條碼因穿孔、汙損等引起局部損壞時,照樣可以正確得到識讀,損毀面積達 50% 仍可恢復信息。解碼可靠性高:它比普通條碼解碼錯誤率百萬分之二要低得多,誤碼率不超過千萬分之一。簡介

我們可以先試著生成一個二維碼。https://kazuhikoarase.github.io/qrcode-generator/js/demo/

如圖可以發現,二維碼有 4 個可變項,其中主要的 2 個為:

一共有 40 個尺寸,對應 40 個版本;Version1是 21*21 的矩形,之後每增加一個版本,就增加4的尺寸,即(v-1)4+21,最高是Version40,177177 的正方形。

容錯率(ErrorCorrectionLevel)

二維碼容錯率即是指二維碼圖標被遮擋多少後,仍可以被掃描出來的能力。容錯率越高,則二維碼圖片能被遮擋的部分越多。二維碼有 4 個容錯等級:

根據以上配置不同,相同的內容,在不同的配置下產生的二維碼不一樣,但掃出的內容是一樣的

設計原理

日常我們看到的二維碼就是一張由黑白色塊混合在一起的一張圖片,我們肯定也知道這些黑白色塊就是內容的某種編碼,但其實除了內容外,二維碼還有許多其他輔助掃碼識別的信息。

如上圖,按右側標識的從上到下的順序,分別是:

功能區:

位置探測圖形:位於左上、左下、右上的三個矩形,可以說是二維碼最重要的組成部分。

確定二維碼的放置方向:不管順著掃倒著掃,都可以準確找到第一個編碼字符的位置(左上矩形的右邊);如果任一矩形被遮擋,掃描設備將無法定位。確定編碼字符的邊界:確定編碼字符的上下左右邊界,不被周圍其他信息幹擾。

位置探測圖形分隔符:位置探測圖形周圍的白邊,用於分割位置探測圖形和數據。

定位圖形:三個位置探測圖形之間的兩根「線」,用於確定二維碼符號中模塊的坐標(相當於坐標軸)。

校正圖形:用於校正定位(只有版本2以上有),版本越高個數越多,以校正可能發生的定位偏移。

從谷歌搜二維碼圖片,可以觀察下,這些二維碼都具有位置探測圖形、位置探測圖形分隔符及定位圖形。其中第三幅,定位圖形不太對,也確實就掃不出來。

數據區:

數據和糾錯碼字:最主要的部分,用於存放數據和糾錯信息。

除掉定位區以及格式信息,數據和糾錯碼字的排布如下:

生成流程

在所有數據都完成放置之後,還有一步操作:添加掩碼。掩碼主要是為了避免,如果出現大面積的空白或黑塊,導致我們掃描識別的困難。常用的掩碼如下:

數據經過掩碼後,基本不會再出現大面積的黑塊和白塊,利於掃描。

掩碼只會與數據區進行 XOR,不會影響功能區。

代碼概覽

只要遵循以上二維碼的規範,生成對應的二維碼圖形即可,具體實現邏輯不影響。這裡我們參考jquery-qrcode,簡單看下實現,主要流程如下:

makeImpl : function(test, maskPattern) {


    this.moduleCount = this.typeNumber * 4 + 17;

    this.modules = new Array(this.moduleCount);

    for (var row = 0; row < this.moduleCount; row++) {
    
      this.modules[row] = new Array(this.moduleCount);
      

      for (var col = 0; col < this.moduleCount; col++) {
        this.modules[row][col] = null;//(col + row) % 3;
      }

    }
    

    this.setupPositionProbePattern(0, 0);// 位置探測圖形

    this.setupPositionProbePattern(this.moduleCount - 7, 0);// 位置探測圖形

    this.setupPositionProbePattern(0, this.moduleCount - 7);// 位置探測圖形

    this.setupPositionAdjustPattern(); // 校正圖形

    this.setupTimingPattern(); // 定位圖形(坐標軸)

    this.setupTypeInfo(test, maskPattern); // 版本信息

   

    if (this.typeNumber >= 7) {
      this.setupTypeNumber(test);
    }

    if (this.dataCache == null) {
      this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); // 生成數據
    }

    this.mapData(this.dataCache, maskPattern); // 加入掩碼
  },

生成二維數據後,再把點一一繪製出來即可:

var createCanvas  = function(){
      // create the qrcode itself
      var qrcode  = new QRCode(options.typeNumber, options.correctLevel);
      qrcode.addData(options.text);
      qrcode.make();

      // create canvas element
      var canvas  = document.createElement('canvas');
      canvas.width  = options.width;
      canvas.height = options.height;
      var ctx   = canvas.getContext('2d');

      // compute tileW/tileH based on options.width/options.height
      var tileW = options.width  / qrcode.getModuleCount();
      var tileH = options.height / qrcode.getModuleCount();

      // draw in the canvas
      for( var row = 0; row < qrcode.getModuleCount(); row++ ){
        for( var col = 0; col < qrcode.getModuleCount(); col++ ){
          ctx.fillStyle = qrcode.isDark(row, col) ? options.foreground : options.background;
          var w = (Math.ceil((col+1)*tileW) - Math.floor(col*tileW));
          var h = (Math.ceil((row+1)*tileH) - Math.floor(row*tileH));
          ctx.fillRect(Math.round(col*tileW),Math.round(row*tileH), w, h);  
        } 
      }

      // return just built canvas
      return canvas;

    }

藝術二維碼

日常我們見到的二維碼都是黑白的,但其實二維碼可以多姿多彩。

這裡有很多樣式,可以試一試https://qrbtf.com/。

二維碼之所以可以五顏六色,是因為二維碼的有用信息只是 0 和 1,至於 0 和 1 用什麼信息表達,只要掃碼軟體可以識別就行。目前的掃碼軟體一般都是對圖片進行灰度處理,所以二維碼上的點無論如何表達,只要經過灰度處理後 0 和 1 沒有顛倒,則信息不會出錯,不會影響掃碼結果。

藝術二維碼實現起來也不難,只要區分特定的數據區,並用特定的圖片渲染即可,有興趣可以參考https://github.com/252860883/ArtQRCode。

更簡單一點的,也可以直接降低黑白透明度,背景渲染特定的圖片;如果只是網頁上顯示,還可以做成 gif 動圖形式。

 

不過,藝術二維碼由於顏色更豐富幹擾信息更多,因此相比黑白二維碼,藝術二維碼對掃描軟體的要求也更高。

小程序碼

小程序碼和二維碼雖然看起來完全不一樣,但是它們的設計思想及生成流程是基本一樣的。

支持3種容量:36 射線、54 射線和 72 射線;

ps:了解二維碼的原理後,其實我們自己也可以手畫二維碼。發散一下,求婚啥的,用紅玫瑰和白玫瑰擺個二維碼,女朋友掃碼出來一看寫著「Marry Me!」,哈哈哈哈豈不是有點程式設計師的浪漫😬~

參考[二維碼的生成細節和原理](<http://- https://coolshell.cn/articles/10590.html>)https://www.zhihu.com/question/21023430

文內連結

https://kazuhikoarase.github.io/qrcode-generator/js/demo/https://github.com/jeromeetienne/jquery-qrcode/blob/master/src/qrcode.js#L99https://github.com/252860883/ArtQRCode

相關焦點

  • 二維碼會被掃完嗎?
    這次新冠疫情大家會發現,因為有了手機二維碼的使用,我們會把一個人的行程以及他的健康狀況,通過數據處理變得更加的直觀和易於統計。當我們去到一些公共場合的時候,都要拿出手機二維碼來刷。有沒有發現這一個二維碼,今天打開和稍後再打開,它是完全不一樣的,而每一個二維碼又不會指向別的人,就是為當時掃碼的事件而產生的。那麼有沒有想過這二維碼到底有多少?它會不會用光?
  • 天天掃碼,你知道二維碼的英語怎麼說的嗎
    掃碼關注,掃碼付款,掃碼下載等等,二維碼的應用在生活裡越來越普遍。尤其是走在大街上會有推廣某種產品的人說「掃碼關注,免費送某東西」等。今天和大家聊聊二維碼的英語怎麼說的。但我們常用的「二維碼」並不叫2D barcode,它只是2D barcode的一種,因可以快速生成和讀取,它的英文名叫:QR Code。QR是quick response的簡稱,即快速反應的意思。源自發明者希望QR碼,可讓其內容快速被解碼,所以QR code=quick response code。
  • 路邊的野碼掃不掃?你絕不知道的二維碼
    擺脫了這些小妹去吃飯,結帳時掃一下店家的二維碼,即刻完成付款。吃飽了溜達,在一棵電線桿子下註腳,又會看到電線桿子上貼著一張「掃我有驚喜」的二維碼。這樣的經歷想必每個人都有過,二維碼隨著移動網際網路的興起,已經與無形間滲入了我們的生活,可是,我們在享受二維碼帶給我們方便的同時,又是否真的了解二維碼?今天,我們不聊您看不懂的,只聊您想知道的,關於二維碼的那些事。(文中圖片均來源於網絡)
  • 你真的會正確使用二維碼嗎?
    但如此應用廣泛的二維碼,也成為不法分子手裡的犯罪工具,下面小珊帶大家全面了解二維碼有哪些安全隱患,以及如何在使用的過程中保護好自己的個人信息。這類軟體號稱可以秒搶紅包,全自動為你搶紅包,聽上去是不是十分誘人,但軟體裡卻植入了木馬病毒,不法分子用它來收集用戶的隱私信息如帳號密碼、電話、照片等。▍案例3:免費搶票助手。眾所周知,春運搶票之難,難於上青天。
  • 我們每天都在掃的二維碼,竟然是他們發明的......
    不知道大家是不是像我一樣現在出門完全不帶現金,一部手機走天下不管是坐公交地鐵還是吃飯買東西掃個碼就能輕鬆付款
  • 你真的了解五聲音階嗎?
    你真的了解五聲音階嗎?五聲音階是廣大吉他愛好者最喜歡用的一種音階,也是傳統搖滾樂,布魯斯,流行搖滾,鄉村音樂等風格中最常用的solo音階。可是作為演奏者的你真的了解五聲音階嗎?你真的知道五聲音階的來歷嗎?
  • 掃碼不如看新聞?香港安心出行二維碼解密
    如果你很上心地使用這個app,並且成功地發現了若干處能掃碼的地方,很自律地每次都掃碼的話,那麼一個問題一定很困擾你: 這個二維碼怎麼好像很難掃的樣子? 對的,這個二維碼就是很難掃。就算你用著最頂級的手機,如果角度稍微偏一點,都可能掃不出來。如果你用的是陳年古董機,要麼掃描的速度超級慢,要麼就是根本掃不出來。 為啥呢?我先上個實際的圖:
  • 瑪雅人曾用過二維碼購物?距今兩千年的二維碼,遊客掃出了什麼?
    想要了解史前文明在地球上留下的痕跡,只能通過歷史遺蹟和一些古老建築,無獨有偶,科學家曾經意外發現了關於瑪雅人的二維碼。手機的出現讓人類生活更加方便,出門只需要攜帶一部手機可以走天下,我們付錢的時候會掃對方的碼,然而考古學家發現的瑪雅人二維碼,這是什麼情況?如果掃一下會不會出現瑪雅人呢?
  • 乘坐地鐵需掃二維碼!
    為全力做好疫情防控工作,積極應對復工復產,更好地保障乘客安全健康出行,根據市疫情防控指揮部工作部署,大連地鐵迅速啟動乘客進站和乘車掃碼工作。
  • 鞋舌上的二維碼掃不出來是假鞋嗎 鞋舌上的扣帶有什麼用
    不知道大家在買鞋的時候有沒有研究過鞋舌,如果仔細研究過的小夥伴們可能會發現鞋舌上面會有一個二維碼,那麼這個二維碼是幹什麼用的呢?是不是鑑定球鞋真假的呢?如果掃不出來是假鞋嗎?下面就讓小編帶領大家一起來看看吧!
  • 速來圍觀:能吃還能掃的二維碼!
    現如今大家可以在任何地方看到二維碼,如何要在普遍的事物中挖掘新意,讓人們在掏出手機掃碼的一瞬間獲得驚喜?世界各國牛人大神紛紛使出妙招,像維多利亞二維碼下的秘密、韓國Emart超市正午才能掃的二維碼、JCPenny二維碼的禮物祝福等等。
  • 二維碼會被人類掃完嗎?
    光疫情期間,微信「碼上經濟」就用掉了1400億個二維碼,那麼就有同學來問了:因為二維碼的尺寸是有限的,那二維碼的數量就是有限的。但是掃完所有的二維碼,需要很長很長很長很長的時間。現在的二維碼有40個官方版本(二維碼是由Denso公司於1994年9月研製的一種矩陣二維碼符號)。
  • 掃了那麼多二維碼,15款工具打造你的專屬二維碼【實戰乾貨】
    自媒體、產品信息、優惠、社交媒體、房地產信息、行動支付、電子券、App下載、公眾號等等都有應用到二維碼,我相信生活在移動網際網路時代的你,一定掃了很多很多的二維碼(反正我掃了很多),但是,掃了那麼多二維碼,你有屬於自己的專屬二維碼嗎?"工欲善其事必先利其器",下面介紹15款在線二維碼生成工具,很適合個人及企業。
  • 在龍江街上有人請求你掃二維碼,到底能不能掃?
    後經警方調查,事件是因為「兩名女子請求張某掃描手機二維碼遭到拒絕」引起。其實,類似這種在公共場合被「請求掃碼」的行為,我們在日常生活中也時有遇到:「你好,我在自主創業,能否掃碼關注一下這個公眾號?」「你好,我在參加一個鍛鍊,要完成加100個陌生人為好友的任務,能否掃碼關注一下我?」
  • 天天掃的「二維碼」用英語怎麼說?
    the QR code快速響應碼;二維碼QR = quick response【解釋】「二維碼」實際上是條形碼的一種,英文是2-D barcode,也就是two-dimensional空間的;尺寸的但我們常用的「二維碼」並不叫2D barcode,它只是2D barcode的一種,因可以快速生成和讀取,它的英文名叫:QR Code【例子】掃碼我們用scan這個單詞掃碼支付:scan the QR code to pay掃碼關注:scan the QR code to follow掃碼獲取app:Scan
  • 這5種二維碼千萬別掃!
    「」掃二維碼如今已是司空見慣的事情。在菜市場買菜、在商場購物、在飯店就餐、外出乘坐計程車……可以說,二維碼已經覆蓋了人們衣食住行的方方面面。在電子支付時代,二維碼為群眾提供了極大的便利,但不可否認的是,與方便快捷同行的是無處不在的掃二維碼騙局。現實生活中,掃二維碼陷阱有多少?如何才能讓掃碼更安全呢?小編這就帶你去了解一下!劃重點01 這5種二維碼掃不得!
  • 2000年前瑪雅人留下過二維碼,遊客好奇去掃碼,最後掃出了什麼?
    圖片來源於網絡,如有侵犯請聯繫刪除最讓我們印象深刻的便是他們預言的2012「世界末日」,於是在2012年人心惶惶,很多人都堅信世界末日真的要來臨隨後很多曾堅信瑪雅預言的人,隨著這個謠言的熱度,也慢慢對瑪雅文明產生了疑惑,懷疑他們真的會高瞻遠矚嗎?雖然大多數人都是通過2012年世界末日才知道的瑪雅文化,但早在1839年,約翰·史蒂芬斯曾更早發現過瑪雅文化,他帶著探險隊進入美洲熱帶叢林,驚喜發現了瑪雅人的遺蹟。
  • 每天都在掃一掃,但你知道二維碼的原理是什麼嗎?
    世界那麼大,謝謝你來看我!!關注我你就是個網絡、電腦、手機小達人 二維碼這麼火,它的原理是什麼?
  • adidas二維碼很常見,但你知道用什麼掃碼嗎?
    adidas二維碼怎麼掃描,操作方法很簡單,方式也有很多,最簡單的就是打開任意的瀏覽器,右上角通常都會有一個可以掃描二維碼的功能,然後打開這一功能,對準我們要掃描的Adidas的二維碼,就可以查詢鞋的信息,也可以通過這些信息來辨別鞋的真偽。
  • 這種二維碼千萬別掃,出現這個頁面你就麻煩大了
    在南京新街口萊迪廣場上,經常有多名年輕人會手持一些小禮物,熱情地邀請你幫他們掃二維碼。或許你是為了一個小禮物;或許你是不擅長「拒絕」別人;又或許你是為了幫他們一個忙……無論您出於什麼目的,但從今天起,您務必需要謹慎幫助陌生人掃描二維碼,尤其是「好友輔助註冊」和「好友輔助認證」,因為你以為的「愛心」,很有可能為「作惡」助力。