二维码
二维条形码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息。
二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
zxing
zxing项目是谷歌推出的用来识别多种格式条形码的开源项目。在Zxing中,使用BitMatrix
来描述一个二维码,在其内部存储一个看似boolean
值的矩阵数组。这个类很好的抽象了二维码。
zxing有多个人在维护,覆盖主流编程语言,也是目前还在维护的较受欢迎的二维码扫描开源项目之一,主要的核心代码在core
文件夹里面。
项目地址
GitHub - zxing/zxing: ZXing ("Zebra Crossing") barcode scanning library for Java, Android
https://github.com/zxing/zxing
帮助文档
依赖的引入
只使用zxing-core包,那么我们最多可以得到一个BitMatrix
, 我们想要看见二维码,则还需要将其转换成一个图片,而图片在不同的平台则是以不同的形式存在的。如png文件, jpg文件、Android的Bitmap, Java SE的 BufferedImage.
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.1.0</version>
</dependency>
具体使用
1.用zxing创建普通二维码
/**
* 用zxing创建普通二维码
* @param width
* @param height
* @param format
* @param content
* @param path
* @return
*/
public static BufferedImage createImage(int width, int height,String format , String content ,String path) {
HashMap map = new HashMap();
//设置容错等级
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//定义字符集,我们设置为utf-8
map.put(EncodeHintType.CHARACTER_SET, "UTF-8");
//设置边距,二维码边距空白宽度为0
map.put(EncodeHintType.MARGIN, 2);
BufferedImage image = null;
try {
//生成二维码对象
BitMatrix bitMatrix = new MultiFormatWriter()
.encode(content, BarcodeFormat.QR_CODE, width, height, map);
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0XFFFFFFFF);
}
}
Path file = new File(path).toPath();
ImageIO.write(image, format, file.toFile());
} catch (WriterException e) {
e.printStackTrace();
}