zoukankan      html  css  js  c++  java
  • 你不可错过的二维码生成与解析-java后台与前端js都有

    1.二维码分类

      二维条码也有许多不同的码制,就码制的编码原理而言,通常分为三种类型。

    1. 线性堆叠式二维码

    编码原理:
    建立在一维条码基础之上,按需要堆积成两行或多行。

    图示:
    image

    1. 矩阵式二维码

    最常用编码,原理:
    在一个矩形空间通过黑白像素在矩阵中的不同分布进行编码。在矩阵相应的位置上,用点(方点、圆点或其它形状)的出现表示二进制“1”,点的不出现表示二进制的“0”

    图示:
    image

    1. 邮政码

      通过不同长度的条进行编码,主要用于邮政编码。

    2.QR Code

      现在最常用的就是这种,咱们现在主要介绍的也是这种。为啥这种使用二维码那么受反应呢?主要QR Code这种二维码有如下优点:

    1. 识读速度快
    2. 数据密度大
    3. 占用空间小

    2.1 QR Code介绍

    image

    2.2 QR Code 结构

    image
    大家可以了解下二维码的结构,知道大概就行了,如果想了解详细信息的话可以自行百度,国家有详细的二维码规范。

    3.后台JAVA代码实现二维码(QR Code)生成

      这里介绍如下两种实现方式:

    1. Java 后台实现,主要使用zxing和qrcodejar等第三方jar包。
    2. 前端javascript实现,主要使用jquery.qrcode.js

    3.1 使用zxing生成二维码

    3.1.1 zxing相关网站

    zxing的GitHub
    zxing的Java文档

    3.1.2 生成zxing jar包

    由于github上没有相关的jar包,所以需要我们自己生成一下,上面有好多关于android相关的,我们只需要选取核心包和javase这两部分代码。既下图矩形框内容:
    image
    生成方式我大致说下:首先在ecplise里新建一个java项目zxing,将刚才画框代码拷贝进去,然后导出jar包即可。如果你不想生成也可以在我的github上自行下载。

    3.1.3 生成二维码代码

    1. package cn.rivamed.zxing;
    2. import java.io.File;
    3. import java.nio.file.Path;
    4. import java.util.HashMap;
    5. import com.google.zxing.BarcodeFormat;
    6. import com.google.zxing.EncodeHintType;
    7. import com.google.zxing.MultiFormatWriter;
    8. import com.google.zxing.client.j2se.MatrixToImageWriter;
    9. import com.google.zxing.common.BitMatrix;
    10. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    11. public class CreateQRCode {
    12. public static void main(String[] args) {
    13. int width=300;
    14. int height=300;
    15. String format="png";
    16. //这里如果你想自动跳转的话,需要加上https://
    17. String content="https://github.com/hbbliyong/QRCode.git";
    18. HashMap hits=new HashMap();
    19. hits.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码
    20. //纠错等级,纠错等级越高存储信息越少
    21. hits.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
    22. //边距
    23. hits.put(EncodeHintType.MARGIN, 2);
    24. try {
    25. BitMatrix bitMatrix=new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height,hits);
    26. //如果做网页版输出可以用输出到流
    27. //MatrixToImageWriter.writeToStream(matrix, format, stream);
    28. Path path=new File("D:/zxingQRCode.png").toPath();
    29. MatrixToImageWriter.writeToPath(bitMatrix, format, path);
    30. } catch (Exception e) {
    31. // TODO Auto-generated catch block
    32. e.printStackTrace();
    33. }
    34. System.out.println("that is all");
    35. }
    36. }

    生成的结果如下:
    image

    由于代码都有详细注释,我就不一一讲解了,有疑问可以留言,我们一块探讨。

    3.1.4 解析二维码代码

    1. package cn.rivamed.zxing;
    2. import java.awt.image.BufferedImage;
    3. import java.io.File;
    4. import java.io.IOException;
    5. import java.util.HashMap;
    6. import javax.imageio.ImageIO;
    7. import com.google.zxing.Binarizer;
    8. import com.google.zxing.BinaryBitmap;
    9. import com.google.zxing.EncodeHintType;
    10. import com.google.zxing.LuminanceSource;
    11. import com.google.zxing.MultiFormatReader;
    12. import com.google.zxing.MultiFormatWriter;
    13. import com.google.zxing.NotFoundException;
    14. import com.google.zxing.Result;
    15. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    16. import com.google.zxing.common.BitArray;
    17. import com.google.zxing.common.BitMatrix;
    18. import com.google.zxing.common.HybridBinarizer;
    19. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    20. public class ReadQRCode {
    21. public static void main(String[] args) {
    22. try {
    23. MultiFormatReader formatReader=new MultiFormatReader();
    24. File file=new File("D:/zxingQRCode.png");
    25. BufferedImage image=ImageIO.read(file);
    26. BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
    27. HashMap hints=new HashMap();
    28. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//编码
    29. Result result=formatReader.decode(binaryBitmap, hints);
    30. System.out.println("解析结果:"+result.toString());
    31. System.out.println("二维码格式类型:"+result.getBarcodeFormat());
    32. System.out.println("二维码文本"+result.getText());
    33. } catch (Exception e) {
    34. // TODO Auto-generated catch block
    35. e.printStackTrace();
    36. }
    37. }
    38. }

    3.2 使用qrcode生成解析二维码

    3.2.1 生成二维码

    1. package cn.rivamed.qrcode;
    2. import java.awt.Color;
    3. import java.awt.Graphics2D;
    4. import java.awt.image.BufferedImage;
    5. import java.io.File;
    6. import java.io.IOException;
    7. import java.io.UnsupportedEncodingException;
    8. import javax.imageio.ImageIO;
    9. import com.swetake.util.Qrcode;
    10. public class CreateQRCode {
    11. public static void main(String[] args) throws IOException {
    12. Qrcode x=new Qrcode();
    13. int version=7;
    14. x.setQrcodeErrorCorrect('M');//纠错等级
    15. x.setQrcodeEncodeMode('B');//N代表数字,A代表a-Z,B代表其它(中文等)
    16. x.setQrcodeVersion(version);//版本号
    17. String qrData="https://github.com/hbbliyong/QRCode.git";
    18. //int width=300;
    19. int width=67+12*(version-1);
    20. //int height=300;
    21. int height=67+12*(version-1);
    22. BufferedImage bufferedImage=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    23. Graphics2D gs=bufferedImage.createGraphics();
    24. gs.setBackground(Color.WHITE);
    25. gs.setColor(Color.BLACK);
    26. gs.clearRect(0, 0, width, height);
    27. int pixoff=2;//偏移量,如果不加有可能会导致识别不准确
    28. //如果有汉字需要加上编码
    29. byte[] d=qrData.getBytes("gb2312");
    30. //byte[] d=qrData.getBytes();
    31. if(d.length>0&&d.length<120){
    32. boolean[][] s=x.calQrcode(d);
    33. for(int i=0;i<s.length;i++){
    34. for(int j=0;j<s.length;j++){
    35. if(s[j][i]){
    36. gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
    37. }
    38. }
    39. }
    40. }
    41. gs.dispose();
    42. bufferedImage.flush();
    43. ImageIO.write(bufferedImage, "png", new File("D:/qrcode.png"));
    44. }
    45. }

    生成的结果如下:

    image

    这里需要注意的是,二维码长宽不能想zxing之直接定义,需要跟进这个公式生成67+12*(version-1)。比如我直接定义二维码的长宽为300.就会变成如下样子。
    image这上面空白看的不是太清,你把图片下载下载下来看就比较明显了。

    3.2.2 解析二维码

    1. package cn.rivamed.qrcode;
    2. import java.awt.image.BufferedImage;
    3. import java.io.File;
    4. import java.io.IOException;
    5. import javax.imageio.ImageIO;
    6. import jp.sourceforge.qrcode.QRCodeDecoder;
    7. import jp.sourceforge.qrcode.data.QRCodeImage;
    8. public class ReadQRCode {
    9. public static void main(String[] args) throws IOException {
    10. File file=new File("D:/qrcode.png");
    11. BufferedImage bufferedImage=ImageIO.read(file);
    12. QRCodeDecoder codeDecoder=new QRCodeDecoder();
    13. String result=new String(codeDecoder.decode(new QRCodeImage() {
    14. @Override
    15. public int getWidth() {
    16. // TODO Auto-generated method stub
    17. return bufferedImage.getWidth();
    18. }
    19. @Override
    20. public int getPixel(int arg0, int arg1) {
    21. // TODO Auto-generated method stub
    22. return bufferedImage.getRGB(arg0, arg1);
    23. }
    24. @Override
    25. public int getHeight() {
    26. // TODO Auto-generated method stub
    27. return bufferedImage.getHeight();
    28. }
    29. }),"gb2312");
    30. System.out.println(result);
    31. }
    32. }

    4.前台代码jquery生成二维码

    4.1 jquery.qrcode.js 的 GitHub

    4.2 相关代码

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>二维码生成</title>
    8. <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.min.js"></script>
    9. <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.qrcode.min.js"></script>
    10. </head>
    11. <body>
    12. 生成的二维码如下:<br>
    13. <dir id="qrcode"></dir>
    14. <script type="text/javascript">
    15. jQuery('#qrcode').qrcode('https://github.com/hbbliyong/QRCode.git');
    16. </script>
    17. </body>
    18. </html>

    5.结束语

    所有的代码我都上传到了github上面,大家可以下载运行。这里面介绍的都比较基础的,但也包含了前端后台多种方式,对于简单的应用已经足够了。至于一些扩展,如果加上logo啊,电子名品啊,大家可以自行摸索。感谢您的观看,如果有什么疑问可以留言。

    ps:
    一个在线生成二维码的网站推荐:在线工具
    这个工具也是使用的zxing

  • 相关阅读:
    Java8 Period.between方法坑及注意事项
    mybatis入门-第一个程序
    mybatis入门-框架原理
    初识servlet--未完成
    初识servlet
    session是什么
    session工作原理简介
    笔记本维修介绍
    j2se 总结
    maven
  • 原文地址:https://www.cnblogs.com/jpfss/p/9518223.html
Copyright © 2011-2022 走看看