兒童繪畫教室 – 教你如何畫QR code 101

各位小朋友,今天老師要來教一種新的繪畫手法,這個不需要素描那種細膩的筆觸,也不需要油畫那種豐富的色彩,只要一支夠黑的筆,和適當的紙張即可。

我想現在大家應該沒人不知道QR code了吧,在網站上、平面海報、電視牆、甚至你的發票上都會出現一個小小黑白黑白的方塊,只要拿出你的智慧型手機,輕輕地掃描一下,手機就會帶你去那個code裡面的內容(雖然大部分都是廣告),不過既然是繪畫教室,我們就不探討怎麼利用QR code讓你的事業更成功、如何交到女朋友或是男朋友之類的,這裡只教你如何畫畫。

Source: wikipedia

我們先來介紹一下QR Code的歷史吧,這個一開始是由Toyota下面的Denso Wave在1994年發明出來的,本來是用來追蹤車輛的,後來發展到現在大家都熟知用法,QR code一共有40種Version,第一種也是最簡單的一種,一邊有21個點(21 x 21),每多一個Version,每邊就會多四個點(舉例:Version2 就是 25 x25),到了Version 40,一邊有177個點,點越多,可以容納的字數就越多。根據訂製的規格書,QR code可以放四種東西,第一是數字,第二是英文字母加數字(和一些標點符號),第三種是8 bit的二元碼,第四種是日文(好吧,因為這是日本人發明的)

每個coding 系統都會有所謂的錯誤修正碼(error correct code),這些碼是外加在原本內容上面的,主要以防這個 code在傳輸時,中間有些數字或是點被弄髒、弄丟了,我們可以借用這個多餘的數字來還原我們原本的內容。QR code用的是Reed-Solomon error correction,這種麼算的,我們這裡也就不介紹,只要知道一點就是,這個演算法需要修正碼長度等於要修正的碼的兩倍,聽起來像是繞口令是吧,聽我講個例子就會明白了,假如說你的內容有100個字,在你傳送時,有50個字消失了,假如你需要復原那50個字,你則需要100個字的修正碼,所以你需要傳送 200個字(其中100個字是修正碼),然後你可以修正50個字,換句話說,你可以修正25% (50/200)的內文,目前QR code有定四種修正等級,最高可以回復到30%的字串。

source:http://www.swetake.com/qr/qr1_en.html

好吧,我們來看看真正的QR code是怎麼形成的,上圖是一個Version 1的QR code,一邊有21個小方塊,各位看到那三個黑黑的方塊了嗎,那是用來辨認方位的,所以程式在掃描時,可以確認位置,那三個方塊中間被一個像是斑馬線的線連起來,那兩條是用來讓程式方便辨認座標的,黃色區域是Code的內容並且加上修正碼,那各青色部份則是一些格式的設定(像是你要哪種的修正等級之類的)。

我們先來填填黃色區域,假設我們想要把文字”ABCDE123″ 轉成 QR code,一開始,我們要先告訴這內容是哪種型態(數字、文字、還是日文),看我的文字是屬於字母加上數字型,在QR code的定義裡,這是0010(別忘了,在QR code的世界裡,只有黑點跟白點,也就是0跟1),這也是黃色區的起頭,接下來,我們要告訴decoder,這串文字有多長,那串文字一共有八個字母,在二進位中是1000,在Version 1-9,QR code給你9 bit來定義長度,所以前面要加上五個零來湊成9 bit,所以我們的字母就便成了

0010 000001000 (前四個是型態 後九個是長度)

source: wikipedia

接下來我們要來進入真正的文字內容了,大家看看上面那個表,每個數字和字母都有一個代表的值,在QR code中是用每兩個字母來分別編碼,每兩個字母給你11 bit來用,用我們上述的例子,我們得把內容分為”AB”, “CD”,”E1″,”23″來看,先來看”AB”,A在那個表中是10,B是11,QR code規定的計算公式是用10x 45+11 = 461,為什麼要乘以45呢?大家看一下那個表一共有45個值(有點像是45進位),然後我們再把461換成2進位也就是 00111001101,在加上我們之前的編碼就變成了 0010 00000100 00111001101,以此類推,我們也可以算出”CD”, “E1”,”23″的值。

等文字全部都轉換完成 我們在結尾加入 0000當做結尾,最後得出以下的字串

0010 000001000 00111001101 01000101001 01001110111 00001011101 0000

我們把這一串數字整理一下,讓它變成8 bit 一組,假如不足8 就用0把它補足

00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000

我們現在得到了8組 8 bit的數據,但是即使在Version 1 和最多的修正碼下,QR code可以容納9組 8bit的數據 (看表),所以我們在後面在填上了一組11101100 (萬一要填兩組以上,第二組要填 00010001,第三組再填11101100 輪流交替填這兩組直到到容納上限為止)

00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000 11101100

好了,這就是我們所有的內文了。

source:wikipedia

接下來我們要學怎麼來填這個格子,我們來看看上面這張圖,填格子要從最下面左邊開始填,你可照上面的,先填四個,以後都是八個八個填,也可以直接用8個來填,這個規則是這樣的,先往左邊填,兩個一組,填到第二個,退回原來一個,然後往上,萬一不能往上,就往下,萬一不能往下,就往左(反正無論怎樣都不會往右就是了),假如字串是0,就不填,是1就把格子塗滿。

最後畫出來就是這樣,大家會不會覺得奇怪,怎麼畫出來有點少阿,還有老師是不是作弊,明明就只需要黑筆,為什麼最後出現紅色呢?畫出來有點少,是因為我們還缺乏修正碼,那些紅色的條是拿來填格式的資訊的,我先把它塗紅下來,免得畫錯…(好吧,我還是做了點弊),至於怎麼補那些紅條和剩下的空白呢?那請各位期待102拉。(其實是老師黑色筆沒水了)

最後在這個聖誕夜,想祝大家佳節愉快,或許在台灣感受不深,不過聖誕夜可是西方重要節日,希望大家都有一個美好的聖誕夜。

參考網站1:http://en.wikipedia.org/wiki/QR_code

參考網站2:http://www.swetake.com/qr/qr1_en.html

喜歡這篇文章嗎? 分享出去給作者一點鼓勵吧!
  • 真是有趣的東西,感謝分享!!
    另外,
    聖誕快樂!

  • John D Lau

    老师圣诞快乐。

  • John D Lau

    老师,貌似最后11101100一个您涂错了。。。 如果是我错了,请见谅

  • Po-Yu Chuang

    typo?
    填格子要從最下面’左’邊開始填 –> 右?