导读


简单的来说,通过将URL生成二维码,比如微信登录,就是采用扫二维码来发送请求。

使用


1、依赖

  1. <!-- https://mvnrepository.com/artifact/QRCode/QRCode -->
  2. <dependency>
  3. <groupId>QRCode</groupId>
  4. <artifactId>QRCode</artifactId>
  5. <version>3.0</version>
  6. </dependency>

1、jar包爆红

如果添加依赖爆红,如下,可以下方链接获取jar包:
QRCode.zip

image.png

未生成jar包,如下:
image.png

1.1、解决办法

将jar包解压复制到对应依赖生成jar包的位置,如下:
image.png
在项目中输入以下命令:

  1. mvn install:install-file -Dfile=E:\MavenHouse\QRCode\QRCode\3.0\QRCode.jar -DgroupId=QRCode -DartifactId=QRCode -Dversion=3.0 -Dpackaging=jar

解释说明:

  1. mvn install:install-file
  2. -DgroupId=包名
  3. -DartifactId=项目名
  4. -Dversion=版本号
  5. -Dpackaging=jar
  6. -Dfile=jar文件所在路径

然后成功,不再爆红了:
image.png

2、工具类

1、生成二维码

  1. /**
  2. * 生成二维码
  3. * @param content :二维码中的内容
  4. * @param imgPath :二维码生成的位置
  5. * @param version :版本
  6. * @return void
  7. */
  8. public static void encoderQRCode(String content, String imgPath,int version) {
  9. try {
  10. Qrcode qrcodeHandler = new Qrcode();
  11. //设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
  12. qrcodeHandler.setQrcodeErrorCorrect('M');
  13. //N代表数字,A代表字符a-Z,B代表其他字符
  14. qrcodeHandler.setQrcodeEncodeMode('B');
  15. //版本1为21*21矩阵,版本每增1,二维码的两个边长都增4;所以版本7为45*45的矩阵;最高版本为是40,是177*177的矩阵
  16. qrcodeHandler.setQrcodeVersion(version);
  17. int imgSize = 67 + 12 * (version- 1) ;
  18. System.out.println("二维码中的内容:" + content);
  19. byte[] contentBytes = content.getBytes("gb2312");
  20. BufferedImage bufImg = new BufferedImage(imgSize , imgSize ,BufferedImage.TYPE_INT_RGB);
  21. Graphics2D gs = bufImg.createGraphics();
  22. gs.setBackground(Color.WHITE);
  23. gs.clearRect(0, 0, imgSize , imgSize );
  24. //设定图像颜色 > BLACK
  25. gs.setColor(Color.BLACK);
  26. //设置偏移量 不设置可能导致解析出错
  27. int pixoff = 2;
  28. //输出内容 > 二维码
  29. System.out.println("二维码中内容的长度:" + contentBytes.length);
  30. if (contentBytes.length > 0 && contentBytes.length < 130) {
  31. boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
  32. for (int i = 0; i < codeOut.length; i++) {
  33. for (int j = 0; j < codeOut.length; j++) {
  34. if (codeOut[j][i]) {
  35. gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
  36. }
  37. }
  38. }
  39. } else {
  40. System.err.println("QRCode content bytes length = "
  41. + contentBytes.length + " not in [ 0,130 ]. ");
  42. }
  43. gs.dispose();
  44. bufImg.flush();
  45. File imgFile = new File(imgPath);
  46. // 生成二维码QRCode图片
  47. ImageIO.write(bufImg, "png", imgFile);
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }

3、解析二维码中的内容

  1. /**
  2. * 解析二维码中的内容
  3. * @param imgPath :二维码的位置
  4. * @return java.lang.String
  5. */
  6. public static String decoderQRCode(String imgPath) {
  7. // QRCode 二维码图片的文件
  8. File imageFile = new File(imgPath);
  9. BufferedImage bufImg = null;
  10. String decodedData = null;
  11. try {
  12. bufImg = ImageIO.read(imageFile);
  13. QRCodeDecoder decoder = new QRCodeDecoder();
  14. decodedData = new String(decoder.decode(new J2SEImage(bufImg)),"gb2312");
  15. } catch (IOException e) {
  16. System.out.println("Error: " + e.getMessage());
  17. e.printStackTrace();
  18. } catch (DecodingFailedException dfe) {
  19. System.out.println("Error: " + dfe.getMessage());
  20. dfe.printStackTrace();
  21. }
  22. return decodedData;
  23. }
  24. static class J2SEImage implements QRCodeImage {
  25. BufferedImage bufImg;
  26. public J2SEImage(BufferedImage bufImg) {
  27. this.bufImg = bufImg;
  28. }
  29. public int getWidth() {
  30. return bufImg.getWidth();
  31. }
  32. public int getHeight() {
  33. return bufImg.getHeight();
  34. }
  35. public int getPixel(int x, int y) {
  36. return bufImg.getRGB(x, y);
  37. }
  38. }
  39. public static void main(String[] args) {
  40. String imgPath = "D:/temp/picture/Test_Qrcode.png";
  41. System.out.println("二维码中的内容:" + decoderQRCode(imgPath));
  42. System.out.println("decoderQRCode QRcode success");
  43. }

详细可以参考:https://blog.csdn.net/weixin_42687829/article/details/93063647