QR 二維碼中插入圖片實(shí)現(xiàn)方法
QR 二維碼中插入圖片
二維碼終于火了,現(xiàn)在大街小巷大小商品廣告上的二維碼標(biāo)簽都隨處可見(jiàn),而且大都不是簡(jiǎn)單的純二維碼,而是中間有個(gè)性圖標(biāo)的二維碼。
我之前做了一個(gè)使用google開(kāi)源項(xiàng)目zxing實(shí)現(xiàn)二維碼、一維碼編碼解碼的程序并開(kāi)放了源碼(用C#實(shí)現(xiàn)的條形碼和二維碼編碼解碼器),今天繼續(xù)在此程序基礎(chǔ)上,實(shí)現(xiàn)二維碼中間加小圖片。
背景知識(shí)
QRcode使用里德-所羅門碼來(lái)進(jìn)行錯(cuò)誤修正。對(duì)于我們來(lái)說(shuō),里德-所羅門編碼有兩個(gè)非常重要的特性。第一,它是一種顯式系統(tǒng)碼,也就是說(shuō),你可以在最終的編碼中直接看到原有的信息。就好比我們對(duì)”hello world”進(jìn)行編碼,最終看到的是”hello world”以及其后面跟隨的幾個(gè)容錯(cuò)碼。第二點(diǎn),里德-所羅門編碼是可以被”異或”的,將兩個(gè)不同里德-所羅門編碼得到的結(jié)果異或運(yùn)算后會(huì)得到一個(gè)新的里德-所羅門碼,并且這個(gè)新碼的原碼即是原來(lái)兩個(gè)原碼的異或。如果你想知道為什么這兩個(gè)特性會(huì)成立,請(qǐng)看Finite Field Arithmetic and Reed-Solomon Coding.
QRcode
一副QRcode圖像會(huì)定義一些獨(dú)特的描述符來(lái)幫助人們或者電腦識(shí)別出自己是一張QRcode。這種描述符隨著QRcode的大小不同而略有區(qū)別——越大的QRcode圖像擁有越多的描述符。但是對(duì)于人的識(shí)別來(lái)說(shuō),特征最明顯的還是圖片的四個(gè)角的符號(hào)是固定的,看到這樣的四個(gè)角人類就本能的反應(yīng):這是一個(gè)QRcode。
(實(shí)際上,我們可以通過(guò)讀取圖像最左上角的兩個(gè)象素點(diǎn)來(lái)判斷編碼的冗余程度。定義黑色為0,白色為1,那么如果看到00則是L級(jí)別的冗余,01是M,10是Q,11則是最高的H級(jí)別冗余。
有了上面的這些工作,我們可以非常容易的知道原碼信息在圖像中的位置。然后通過(guò)改變自己的原碼信息,就可以改變圖像中的像素以至于可以在里面作圖了。雖說(shuō)如此,下面的一些情形可以讓事情變得更有趣。
我做的二維碼插入圖片:
之前我給大家免費(fèi)提供了使用zxing開(kāi)源項(xiàng)目改造而成的一二維碼編碼解碼器,但未能插入圖片。這次經(jīng)過(guò)一番努力,成功將圖片插入二維碼,并能編碼和解碼。插入圖片的關(guān)鍵在于二維碼容錯(cuò)系數(shù)的調(diào)整,源碼中有詳盡描述。
界面:
要在二維碼中插入圖片且可以正常解碼,主要注意以下兩點(diǎn)即可:
1.設(shè)置二維碼的容錯(cuò)系數(shù)要高;
在Zxing項(xiàng)目中,二維碼生成的時(shí)候是可以設(shè)置容錯(cuò)系數(shù)的:
將EncodeHintType.ERROR_CORRECTION設(shè)置成ErrorCorrectionLevel.H
//構(gòu)造二維碼寫碼器 MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter(); Hashtable hint=new Hashtable(); hint.Add(EncodeHintType.CHARACTER_SET,"UTF-8"); hint.Add(EncodeHintType.ERROR_CORRECTION,com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H); //生成二維碼 ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, 300, 300,hint); Bitmap img = bm.ToBitmap();
2.中間插入的圖片大小和位置要合適;
中間圖片如果太大,遮住了二維碼的大部分面積,那肯定不行,如果太小,就起不到個(gè)性化的效果。
那么多大合適呢,根據(jù)前文中描述的QR碼的特點(diǎn),其三個(gè)帶方塊的角上是數(shù)據(jù)區(qū),不能覆蓋,只有中間和右下角這片區(qū)域可以覆蓋,但也不宜過(guò)大。
經(jīng)測(cè)試,中間小圖片尺寸占二維碼總寬度的2/7比較合適,既滿足了圖片的清晰度,又不影響二維碼的加密數(shù)據(jù)。
小圖片最好居中放置,而且形狀可以不規(guī)則。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 使用jquery.qrcode.js生成二維碼插件
- 使用jQuery.Qrcode插件在客戶端動(dòng)態(tài)生成二維碼并添加自定義Logo
- Java 二維碼,QR碼,J4L-QRCode 的資料整理
- Java實(shí)現(xiàn)二維碼QRCode的編碼和解碼與示例解析
- Thinkphp3.2.3整合phpqrcode生成帶logo的二維碼
- asp.net(C#)使用QRCode生成圖片中心加Logo或圖像的二維碼實(shí)例
- PHP QRCODE生成彩色二維碼的方法
- jQuery qrcode生成二維碼的方法
- 使用jquery.qrcode.min.js實(shí)現(xiàn)中文轉(zhuǎn)化二維碼
- 使用jquery插件qrcode生成二維碼
相關(guān)文章
spring boot實(shí)現(xiàn)超輕量級(jí)網(wǎng)關(guān)的方法(反向代理、轉(zhuǎn)發(fā))
這篇文章主要介紹了spring boot實(shí)現(xiàn)超輕量級(jí)網(wǎng)關(guān)(反向代理、轉(zhuǎn)發(fā))的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Java入門基礎(chǔ)之常規(guī)的命名方法和變量的值及其引用
這篇文章主要介紹了Java的命名方法和變量的值及其引用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09深入淺析java web log4j 配置及在web項(xiàng)目中配置Log4j的技巧
這篇文章主要介紹了2015-11-11springmvc直接不經(jīng)過(guò)controller訪問(wèn)WEB-INF中的頁(yè)面問(wèn)題
這篇文章主要介紹了springmvc直接不經(jīng)過(guò)controller訪問(wèn)WEB-INF中的頁(yè)面問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java基本數(shù)據(jù)類型和運(yùn)算符詳解
這篇文章主要介紹了Java基本數(shù)據(jù)類型和運(yùn)算符,結(jié)合實(shí)例形式詳細(xì)分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運(yùn)算符、邏輯運(yùn)算符等相關(guān)原理與操作技巧,需要的朋友可以參考下2020-02-02詳解Java中使用ImageIO類對(duì)圖片進(jìn)行壓縮的方法
這篇文章主要介紹了Java中使用ImageIO類對(duì)圖片進(jìn)行壓縮的方法,能夠按指定的比例調(diào)整圖片的寬高,需要的朋友可以參考下2016-04-04maven install報(bào)錯(cuò)中程序包xxx不存在的問(wèn)題解決
本文主要介紹了maven install報(bào)錯(cuò)中程序包xxx不存在的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05