论二维码的原理及生成
大家肯定都用过微信中的扫一扫功能。我们先来全面了解一下二维码
二维码的起源
二维码的起源是日本,原本是Denso
Wave公司为了追踪汽车零部件而设计的一种条码.今日QR码已广泛使用在各行各业.
二维码的特点
- 存储信息量
传统的条形码只能处理20位左右的信息量,与此相比,QR码可处理条形码的几十倍到几百倍的信息量。另外,QR码还可以支持所有类型的数据。(如:数字、英文字母、日文字母、汉字、符号、二进制、控制码等)。一个QR码最多可以处理7089字(仅用数字时)的巨大信息量。 - 在小空间内打印
QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右。(还支持Micro
QR码,可以在更小空间内处理数据。) - 有效的表现各种字母
QR码是日本国产的二维码,因此非常适合处理日文字母和汉字。QR码字集规格定义是按照日本标准“JIS第一级和第二级的汉字”制定的,因此在日语处理方面,每一个全角字母和汉字都用13比特的数据处理,效率较高,与其他二维码相比,可以多存储20%以上的信息。 - 纠错功能
QR码具备“纠错功能”,即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位※1,最多可以纠错约30%※2。 - 360度任一方向读取
QR码从360°任一方向均可快速读取。其奥秘就在于QR码中的3处定位图案,可以帮助QR码不受背景样式的影响,实现快速稳定的读取。 - 支持数据合并功能
QR码可以将数据分割为多个编码,最多支持16个QR码。使用这一功能,还可以在狭长区域内打印QR码。另外,也可以把多个分割编码合并为单个数据。
- 在上图21*21的矩阵中,黑白的区域在QR码规范中被指定为固定的位置,称为寻像图形(finder
pattern)和定位图形(timing
pattern)。寻像图形和定位图形用来帮助解码程序确定图形中具体符号的坐标。 - 黄色的区域用来保存被编码的数据内容以及纠错信息码。
- 蓝色的区域,用来标识纠错的级别(也就是Level L到Level H)和所谓的”Mask
pattern”,这个区域被称为“格式化信息”(format information)。
二维码的生成原理
酷壳中的一篇文章写得不错,可以去看一下:http://coolshell.cn/articles/10590.html
JAVA生成二维码
JAVA中的开源类库(Zxing)用于解析多种格式的条形码和二维码.
Maven中可以引用
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>2.2</version>
</dependency>
public class QRcodeTest {
public static void main(String[] args) {
String myCodeText = "http://www.l99.com/media";
String filePath = "/home/neoyin/temp/bak/test.png";
int size = 125;
String fileType = "png";
File myFile = new File(filePath);
try {
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix byteMatrix = qrCodeWriter.encode(myCodeText,BarcodeFormat.QR_CODE, size, size, hintMap);
int CrunchifyWidth = byteMatrix.getWidth();
BufferedImage image = new BufferedImage(CrunchifyWidth, CrunchifyWidth,
BufferedImage.TYPE_INT_RGB);
image.createGraphics();
Graphics2D graphics = (Graphics2D) image.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, CrunchifyWidth, CrunchifyWidth);
graphics.setColor(Color.BLACK);
for (int i = 0; i < CrunchifyWidth; i++) {
for (int j = 0; j < CrunchifyWidth; j++) {
if (byteMatrix.get(i, j)) {
graphics.fillRect(i, j, 1, 1);
}
}
}
ImageIO.write(image, fileType, myFile);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("\n\nYou have successfully created QR Code.");
}
}