一日一技 | 從原理出發,聊聊如何簡化二維碼

語言: CN / TW / HK

Matrix 首頁推薦

Matrix是少數派的寫作社區,我們主張分享真實的產品體驗,有實用價值的經驗與思考。我們會不定期挑選 Matrix 最優質的文章,展示來自用户的最真實的體驗和觀點。  

文章代表作者個人觀點,少數派僅對標題和排版略作修改。

鑑於二維碼類型眾多,本文提到的二維碼均為 QR Code。同時文中出現的部分二維碼涉及隱私、廣吿等,經過處理無法識別均為正常,感謝理解。

當你掃碼時,手機發生了什麼

二維碼的內容是一段文本,這些文本通過不同的前綴可以被手機識別為不同的數據類型。

以 iPhone 為例,使用自帶的相機,或其它二維碼識別 app 對二維碼進行掃描的時候,會首先判斷識別到的內容前綴,然後通過相應的 app 來打開該內容。如果是純文本,則會使用 Safari 瀏覽器進行搜索。

而文本如果以 http:// 開頭,就代表了該二維碼是一個網址,在進行掃碼的時候會自動通過 Safari 打開該鏈接。其它超鏈接諸如 mailto:[email protected](發郵件)tel:10010(打電話)smsto:10010(發短信) ,以及 URL Scheme 等這類第三方應用接口,也會讓手機調用相關的 app 來執行。而通過 WIFI: 這個前綴還可以使用户直接掃碼聯網(對於可以共享 WiFi 密碼的安卓手機,通常會生成一個二維碼供其他手機掃描,而通過微信掃碼後則可以看到其中的 WiFi 密碼)。

但是多數情況下我們用來掃碼的工具都是微信,而微信支持的只有文本與網頁鏈接,且僅會調用微信內置的瀏覽器打開網址,這就大大限制了二維碼的使用場景,本文也僅針對網址類的二維碼進行簡化的討論。

什麼決定了二維碼的複雜度

影響二維碼複雜度的兩個屬性分別是「內容長度」與「容錯率」。

內容長度:顧名思義,二維碼中所包含的文本長度決定了二維碼畫面的複雜度,文本越長二維碼越複雜,反之則越簡單。

相同的容錯率下不同文本長度的二維碼複雜程度

容錯率:二維碼的容錯率設置為四個等級:L - 低容錯率、M - 中等容錯率、Q - 較高容錯率、H - 高容錯率,其中級別為 L 的容錯率為 7%,M 容錯率為 15%,Q 容錯率為 25%,H 容錯率為 30%,假如一個二維碼在生成時設定容錯率為 L 級別,那麼生成的二維碼被遮擋的內容超過 7% 就無法識別。而越是高容錯的二維碼看起來越是複雜,我們最常見的二維碼多數採用了 M 等級的容錯率,保證一定容錯的情況下儘可能使二維碼趨於簡單。

同樣內容不同容錯等級的兩個二維碼

為何要簡化二維碼

美觀:作為一名平面設計師,簡單的二維碼比起密密麻麻的複雜二維碼看起來更為透氣,也更容易與其它設計元素搭配。所以我在處理包含二維碼的設計工作時,會盡量重製二維碼讓其變的更為簡單美觀。

提高識別度:前文提到説越是複雜的二維碼容錯越高,這裏並非背道而馳。相較於高容錯率,更簡單的低容錯二維碼在線下介質的適應性上,要好於更復雜的二維碼。有時候我們的二維碼掃不出,不是因為二維碼某個位置損毀髒污,而是因為部分介質較低的印刷精度,以及掃描距離的關係,導致低端的手機鏡頭整體無法識別。

二次創作:隨着二維碼逐漸被重視,一些專業的設計師,將二維碼重新設計,使其看起來更具創意卻依然能保證功能性。而這些再次創作的二維碼越是簡單,就越容易被重畫。

圖片來源於網絡,二維碼經過處理,不可掃描

如何讓二維碼變得更簡單

並非所有的二維碼都適合簡單化,這要根據具體的場景來判斷。也並非所有二維碼都能夠有效簡化,這個要看內容。多數情況我們會用到的二維碼內容通常就是以下兩種:

  • 微信名片
  • 網頁鏈接

對於微信名片,解析出的內容其實是以 http:// 開頭的包含微信官方域名的鏈接,該鏈接只能被微信解析,且僅能通過掃碼打開識別到(你發鏈接給別人是不支持打開的)。這類二維碼只能通過降低容錯率進行簡化,但是因為微信名片的容錯率已經是 M 級別,即使降低到 L 級別重新生成也對整體觀感影響有限。

微信名片二維碼簡化後

而網頁鏈接的簡化方式有兩種。第一種是去掉網址中宂餘的參數後綴,比如像天貓的網址,去掉後綴並不影響準確訪問,但是由於二維碼複雜程度與內容長度息息相關,所以生成的二維碼就可以大大簡化。

網址1與網址2訪問到的是同一個頁面

另外一種方式則可以將二維碼簡化到極致,就是使用「短網址服務」。

將長網址縮為短網址,同樣達到了縮減二維碼文本長度的效果。但是該方法有兩個弊端,第一是短網址是通過二次跳轉的方式跳轉到你的長(原)網址中,對於某些長網址來説,跳轉後的訪問可能會存在一些奇奇怪怪的問題:比如無法正確跳轉,但多數情況是正常的;第二就是需要選擇一些大廠的短網址服務,以避免微信等社交軟件封禁短網址域名導致無法正確訪問。如新浪 t.cn ,但由於現在 api 不對外,僅能通過發微博獲取到。

內容縮短了之後,只需要選擇一個順手的二維碼生成工具,生成 L 級別容錯率的二維碼,一個簡化二維碼的過程就算是結束了。而我通常會使用的是由 Python 編寫的 Alfred 動作流插件,只需要一條指令就可以生成一個格式為 svg 的黑白矢量二維碼,且每個小黑點都是獨立分割的,方便後續的改色、大小的調整等,對該插件感興趣的可以 點此下載

快速生成矢量二維碼的 Alfred 插件

最後

看似繁雜的二維碼處理流程,在我的工作流中利用 Alfred 插件,從識別原碼到重新生成的時間僅 10 秒左右。在實際工作中會經常遇到其他人提供的質量參差不齊的二維碼(手機截圖版的、彩色帶裝飾版的、分辨率不足版等),重新生成一次除了能夠簡化二維碼之外,作為素材也能形成統一風格。

而絕大多數人是不需要如此處理二維碼的,但是當你需要的時候,希望本文提供的思路與方法,可以為你的工作增添一個更多的選擇。

感謝閲讀,首次在少數派發文,如有不嚴謹的措辭希望各位派友多多包涵。

關聯閲讀

> 下載少數派 2.0 客户端、關注 少數派公眾號,解鎖全新閲讀體驗 :newspaper: 

> 實用、好用的正版軟件,少數派為你呈現 :rocket: