摘要:時(shí)間年月日星期五說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。線性堆疊式二維碼示意圖矩陣式二維碼在一個(gè)矩形空間通過(guò)黑白像素在矩陣中的不同分布進(jìn)行編碼。
時(shí)間:2017年06月23日星期五
說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)示例源碼:無(wú)
個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s...
二維碼示意圖
使用場(chǎng)景
目錄
二維碼概念 二維碼發(fā)展歷史 二維碼分類 二維碼優(yōu)缺點(diǎn) QR Code 示例講解
二維碼概念
二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規(guī)律在平面(二位方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號(hào)信息的圖形。第二章:二維碼發(fā)展歷史 2-1 二維碼發(fā)展歷史
發(fā)展歷史
一維條碼
一維條碼是由一組粗細(xì)不同、黑白(或彩色)相間的條、空及其相應(yīng)的字符(數(shù)字字母)組成的標(biāo)記,即傳統(tǒng)條碼。
一維條碼示意圖
二維條碼
二維條碼是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向)上分布的條、空相間的圖形來(lái)記錄數(shù)據(jù)符號(hào)信息。
二維條碼示意圖
第三章:二維碼分類 3-1 二維碼分類二維條碼也有許多不同的碼制,就碼制的編碼原理而言,通常分為三種類型:
1.線性堆疊式二維碼 2.矩陣式二維碼 3.郵政碼
線性堆疊式二維碼
編碼原理:建立在一維條碼基礎(chǔ)之上,按需要堆積成兩行或多行。
線性堆疊式二維碼示意圖
矩陣式二維碼
在一個(gè)矩形空間通過(guò)黑、白像素在矩陣中的不同分布進(jìn)行編碼。 在矩陣相應(yīng)元素位置上,用點(diǎn)(方點(diǎn)、圓點(diǎn)或其他形狀)的出現(xiàn)表示二進(jìn)制“1”,點(diǎn)的不出現(xiàn)表示二進(jìn)制的“0”
矩陣式二維碼示意圖
郵政碼
郵政碼通過(guò)不同長(zhǎng)度的條進(jìn)行編碼,主要用于郵件編碼,如:POSTNET、BPO 4-STATE第四章:二維碼優(yōu)缺點(diǎn) 4-1 二維碼優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
高密度編碼,信息容量大 (多達(dá)1850個(gè)大寫(xiě)字母或2710數(shù)字或1108個(gè)字節(jié)或500個(gè)漢字) 編碼范圍廣 可以把圖片、文字、指紋,可以數(shù)字化的信息都可以進(jìn)行編碼,用條碼顯示出來(lái) 容錯(cuò)能力強(qiáng) 譯碼可靠性高 可引入加密措施 成本低、易制作、持久耐用
缺點(diǎn)
二維碼技術(shù)成為手機(jī)病毒、釣魚(yú)網(wǎng)站傳播的新渠道 信息泄露第五章:QR Code 5-1 QR Code
目前流行的三大國(guó)際標(biāo)準(zhǔn):
PDF417:不支持中文 DM:專利未公開(kāi),需支付專利費(fèi)用 QR Code:專利公開(kāi),支持中文
QR Code比其他二維碼相比具有的優(yōu)勢(shì)
識(shí)讀速度快 數(shù)據(jù)密度大 占用空間小
QR Code是由日本Denso公司于1994年研制的一種矩陣二維碼符號(hào)嗎,全稱是Quick Response Code
示意圖
JSP生成二維碼的方法
借助第三方j(luò)ar,如zxing和qrcodejar Javascript,如jquery.qrcode.js第六章:實(shí)例講解 6-1 實(shí)例講解前準(zhǔn)備
zxing地址
https://github.com/zxing/zxing
Maven坐標(biāo)
6-2 使用zxing生成二維碼com.google.zxing core 3.3.0 com.google.zxing javase 3.3.0
代碼演示:
package com.myimooc.zxing; import java.io.File; import java.nio.file.Path; import java.util.HashMap; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * 生成 二維碼 * @author ZhangCheng on 2017-06-23 */ public class CreateQRCode { public static void main(String[] args) { // 定義圖片的寬度和高度 int width = 300; int height = 300; // 定義圖片的格式 String format = "png"; // 定義二維碼的內(nèi)容 String contents = "www.imooc.com"; Path file = new File("D:/img.png").toPath(); // 定義二維碼的參數(shù) HashMap6-3 使用zxing進(jìn)行二維碼解析hints = new HashMap (); hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 設(shè)置字符編碼 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);// 設(shè)置容錯(cuò)等級(jí) hints.put(EncodeHintType.MARGIN, 2);// 設(shè)置邊距(默認(rèn)值5) // 生成二維碼 try { BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,hints); MatrixToImageWriter.writeToPath(bitMatrix, format, file); } catch (Exception e) { e.printStackTrace(); } } }
代碼演示:
package com.myimooc.zxing; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import javax.imageio.ImageIO; import com.google.zxing.BinaryBitmap; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.NotFoundException; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.HybridBinarizer; /** * 讀取 二維碼 * @author ZhangCheng on 2017-06-23 */ public class ReadQRCode { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { MultiFormatReader formatReader = new MultiFormatReader(); // 定義二維碼文件路徑 File file = new File("D:/img.png"); // 讀取圖片文件識(shí)別為一個(gè)圖片流 BufferedImage image; try { image = ImageIO.read(file); BinaryBitmap binaryBitmap = new BinaryBitmap( new HybridBinarizer( new BufferedImageLuminanceSource(image))); // 定義二維碼的參數(shù) HashMap hints = new HashMap(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 設(shè)置字符編碼 // 解析二維碼 Result result = formatReader.decode(binaryBitmap,hints); System.out.println("解析結(jié)果:"+result.toString()); System.out.println("格式類型:"+result.getBarcodeFormat()); System.out.println("文本內(nèi)容:"+result.getText()); } catch (IOException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } } }6-4 使用QR Code方式生成和解析二維碼
QRCode
生成:http://www.swetake.com/qrcode/index-e.html 讀取:https://osdn.jp/projects/qrcode/
代碼演示
1.生成二維碼
package com.myimooc.qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; /** * 生成 二維碼 通過(guò) Qrcode * * @author ZhangCheng on 2017-06-23 */ public class CreateQRCode { public static void main(String[] args) throws Exception { Qrcode x = new Qrcode(); // 二維碼顯示的內(nèi)容 String qrData = "www.imooc.com"; int version = 7; int width = 67 + 12 * (version - 1); int height = 67 + 12 * (version - 1); // 設(shè)置二維碼排錯(cuò)率,可選L(7%)、M(15%)、Q(25%)、H(30%),排錯(cuò)率越高可存儲(chǔ)的信息越少,但對(duì)二維碼清晰 x.setQrcodeErrorCorrect("M");// 糾錯(cuò)等級(jí) x.setQrcodeEncodeMode("B");// N代表數(shù)字,A代表z-Z,B代表其他字符 // 設(shè)置設(shè)置版本號(hào),取值范圍1-40,值越大尺寸越大,可存儲(chǔ)的信息越大 x.setQrcodeVersion(version); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); Graphics2D gs = bufferedImage.createGraphics(); // 設(shè)置屬性 gs.setBackground(Color.WHITE); gs.setColor(Color.BLACK); gs.clearRect(0, 0, width, height); // 偏移量 int pixoff = 2; byte[] d = qrData.getBytes("gb2312"); if (d.length > 0 && d.length < 120) { boolean[][] s = x.calQrcode(d); for (int i = 0; i < s.length; i++) { for (int j = 0; j < s.length; j++) { if (s[j][i]) { gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } gs.dispose(); bufferedImage.flush(); ImageIO.write(bufferedImage, "png", new File("D:/qrcode.png")); } }
2.讀取二維碼時(shí),需實(shí)現(xiàn) QRCodeImage 接口
package com.myimooc.qrcode; import java.awt.image.BufferedImage; import jp.sourceforge.qrcode.data.QRCodeImage; /** * 讀取 二維碼 時(shí),需實(shí)現(xiàn) QRCodeImage 接口 * * @author ZhangCheng on 2017-06-23 */ public class MyQRCodeImage implements QRCodeImage{ BufferedImage bufferedImage; public MyQRCodeImage(BufferedImage bufferedImage){ this.bufferedImage = bufferedImage; } @Override public int getHeight() { return bufferedImage.getHeight(); } @Override public int getPixel(int arg0, int arg1) { return bufferedImage.getRGB(arg0, arg1); } @Override public int getWidth() { return bufferedImage.getWidth(); } }
3.讀取二維碼
package com.myimooc.qrcode; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; /** * 讀取 二維碼 通過(guò) Qrcode * * @author ZhangCheng on 2017-06-23 */ public class ReadQRCode { public static void main(String[] args) throws Exception { File file = new File("D:/qrcode.png"); BufferedImage bufferedImage = ImageIO.read(file); QRCodeDecoder codeDecoder = new QRCodeDecoder(); String result = new String(codeDecoder.decode(new MyQRCodeImage(bufferedImage)),"gb2312"); System.out.println(result); } }6-5 jquery-qrcode生成二維碼
jquery-qrcode
地址:https://github.com/jeromeetienne/jquery-qrcode
代碼演示:
生成二維碼 生成的二維碼如下:
效果如下:
6-6 其他形式的二維碼二維碼還可以這樣
6-7 二維碼擴(kuò)展為什么我們的二維碼掃描出來(lái)是文本而不是鏈接?
如何實(shí)現(xiàn)二維碼掃描安裝手機(jī)軟件?以慕課網(wǎng)為例
如何實(shí)現(xiàn)二維碼掃描名片?
VCard是標(biāo)準(zhǔn)通信薄基本格式
VCard規(guī)范
代碼實(shí)現(xiàn)
第七章:課程總結(jié) 7-1 總結(jié)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67213.html
時(shí)間:2017年07月09日星期日說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無(wú)學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:概述 1-1 課程概述 主要內(nèi)容 驗(yàn)證碼歷史 課程內(nèi)容 不同方案對(duì)比 設(shè)計(jì)與實(shí)現(xiàn) 總結(jié) 1-2 驗(yàn)證碼歷史 驗(yàn)證碼歷史 無(wú)驗(yàn)證碼:垃圾騷擾 Luis von Ahn:Captcha 不斷...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。可以更加專注于業(yè)務(wù)邏輯開(kāi)發(fā),縮短項(xiàng)目開(kāi)發(fā)周期,提高項(xiàng)目開(kāi)發(fā)速度。 時(shí)間:2017年07月15日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無(wú)學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 在用戶進(jìn)行信息概略瀏覽的時(shí)候,提供縮...
摘要:時(shí)間年月日星期五說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。本套課程介紹微信公眾號(hào)開(kāi)發(fā),主要涉及公眾號(hào)介紹編輯模式介紹開(kāi)發(fā)模式介紹等。慕課網(wǎng)是垂直的互聯(lián)網(wǎng)技能免費(fèi)學(xué)習(xí)網(wǎng)站。 時(shí)間:2017年08月11日星期五說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github...
時(shí)間:2017年4月11日星期二說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:對(duì)稱加密算法DES 1-1 JAVA對(duì)稱加密算法DES 加密密鑰=解密密鑰 對(duì)稱加密算法 初等 DES --3D...
摘要:時(shí)間年月日星期日說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼無(wú)個(gè)人學(xué)習(xí)源碼第一章課程概述課程介紹課程須知本課程面向所有使用語(yǔ)言進(jìn)行開(kāi)發(fā)的小伙伴。 時(shí)間:2017年05月21日星期日說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無(wú)個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程概述 1-1 ...
閱讀 1074·2021-11-24 09:39
閱讀 1306·2021-11-18 13:18
閱讀 2425·2021-11-15 11:38
閱讀 1824·2021-09-26 09:47
閱讀 1625·2021-09-22 15:09
閱讀 1624·2021-09-03 10:29
閱讀 1510·2019-08-29 17:28
閱讀 2951·2019-08-29 16:30