广告位联系
返回顶部
分享到

Java使用Zxing二维码生成的代码

java 来源:互联网 作者:佚名 发布时间:2023-01-20 21:40:46 人浏览
摘要

1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的

1、二维码简介

二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值内容信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。二维码具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。

二维码纠错级别

二维码纠错级别指的是在识别二维码时,对于损坏或模糊的二维码的容错能力。

一般来说,二维码有四个纠错级别:

  • L (低):可以纠正7%左右的错误。
  • M (中):可以纠正15%左右的错误。
  • Q (高):可以纠正25%左右的错误。
  • H (高):可以纠正30%左右的错误。

总结:一般来说,使用较高的纠错级别会导致生成的二维码更大,但是它的容错能力也会更强。

2、ZXing简介

ZXing(Zebra Crossing)是Google开发的一个二维码解析和生成的开源库。

官网地址:http://code.google.com/p/zxing/

3、示例

通过Java调用Zxing实现二维码的生成

3.1 搭建一个maven项目,引入Zxing依赖包

1

2

3

4

5

<dependency>

           <groupId>com.google.zxing</groupId>

           <artifactId>javase</artifactId>

           <version>3.3.0</version>

       </dependency>

3.2 创建QrCodeUtil.java 类

具体实现代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

package  QrCodeUtil;

  

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Date;

import java.util.Hashtable;

  

import javax.imageio.ImageIO;

  

  

import com.alibaba.druid.util.StringUtils;

import com.google.zxing.BarcodeFormat;

import com.google.zxing.EncodeHintType;

import com.google.zxing.MultiFormatWriter;

import com.google.zxing.WriterException;

import com.google.zxing.common.BitMatrix;

import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

  

/**

 * 生成二维码

 */

public class QrCodeUtil {

  

    private static final int BLACK = 0xFF000000;

    private static final int WHITE = 0xFFFFFFFF;

    private static final int margin = 0;

    private static final int LogoPart = 4;

  

    public static void main(String[] args) throws WriterException {

        //二维码内容

        String content = "IT技术分享社区,一个有态度的互联网社区交流平台";

        String logoPath = "D:\\logo.png"; // 二维码中间的logo信息 非必须

        String format = "jpg";

        int width = 120; // 二维码宽度

        int height = 120;// 二维码高度

        // 设置二维码矩阵的信息

        BitMatrix bitMatrix = setBitMatrix(content, width, height);

        // 设置输出流

        OutputStream outStream = null;

        String path = "d:/Code" + new Date().getTime() + ".png";//设置二维码的文件名

        try {

            outStream = new FileOutputStream(new File(path));

            // 目前 针对容错等级为H reduceWhiteArea  二维码空白区域的大小 根据实际情况设置,如果二维码内容长度不固定的话 需要自己根据实际情况计算reduceWhiteArea的大小

            writeToFile(bitMatrix, format, outStream, logoPath, 5);

            outStream.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

  

    /**

     * 设置生成二维码矩阵信息

     * @param content 二维码图片内容

     * @param width   二维码图片宽度

     * @param height  二维码图片高度

     * @throws WriterException

     */

    private static BitMatrix setBitMatrix(String content, int width, int height) throws WriterException {

        BitMatrix bitMatrix = null;

        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();

        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定编码方式,避免中文乱码

        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定纠错等级 如果二维码里面的内容比较多的话推荐使用H 容错率30%, 这样可以避免一些扫描不出来的问题

        hints.put(EncodeHintType.MARGIN, margin); // 指定二维码四周白色区域大小 官方的这个方法目前没有没有作用默认设置为0

        bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

        return bitMatrix;

    }

    /**

     * @param matrix

     * @param format

     * @param outStream

     * @param logoPath        logo图片

     * @param reduceWhiteArea 二维码空白区域设置

     * @throws IOException

     */

    private static void writeToFile(BitMatrix matrix, String format, OutputStream outStream, String logoPath, int reduceWhiteArea) throws IOException {

        BufferedImage image = toBufferedImage(matrix, reduceWhiteArea);

        // 如果设置了二维码里面的logo 加入LOGO水印

        if (!StringUtils.isEmpty(logoPath)) {

            image = addLogo(image, logoPath);

        }

        ImageIO.write(image, format, outStream);

    }

  

    /**

     *

     * @param matrix

     * @param reduceWhiteArea

     * @return

     */

    private static BufferedImage toBufferedImage(BitMatrix matrix, int reduceWhiteArea) {

        int width = matrix.getWidth();

        int height = matrix.getHeight();

        BufferedImage image = new BufferedImage(width - 2 * reduceWhiteArea, height - 2 * reduceWhiteArea, BufferedImage.TYPE_3BYTE_BGR);

        for (int x = reduceWhiteArea; x < width - reduceWhiteArea; x++) {

            for (int y = reduceWhiteArea; y < height - reduceWhiteArea; y++) {

                image.setRGB(x - reduceWhiteArea, y - reduceWhiteArea, matrix.get(x, y) ? BLACK : WHITE);

            }

        }

        return image;

    }

  

    /**

     * 给二维码图片中绘制logo信息 非必须

     * @param image    二维码图片

     * @param logoPath logo图片路径

     */

    private static BufferedImage addLogo(BufferedImage image, String logoPath) throws IOException {

        Graphics2D g = image.createGraphics();

        BufferedImage logoImage = ImageIO.read(new File(logoPath));

        // 计算logo图片大小,可适应长方形图片,根据较短边生成正方形

        int width = image.getWidth() < image.getHeight() ? image.getWidth() / LogoPart : image.getHeight() / LogoPart;

        int height = width;

        // 计算logo图片放置位置

        int x = (image.getWidth() - width) / 2;

        int y = (image.getHeight() - height) / 2;

        // 在二维码图片上绘制中间的logo

        g.drawImage(logoImage, x, y, width, height, null);

        // 绘制logo边框,可选

        g.setStroke(new BasicStroke(2)); // 画笔粗细

        g.setColor(Color.WHITE); // 边框颜色

        g.drawRect(x, y, width, height); // 矩形边框

        logoImage.flush();

        g.dispose();

        return image;

    }

  

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/xishining/article/details/128700068
相关文章
  • 基于EasyExcel实现百万级数据导入导出

    基于EasyExcel实现百万级数据导入导出
    在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 大数据的
  • Java使用Zxing二维码生成的代码
    1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编
  • Java经典面试题最全汇总208道(六)

    Java经典面试题最全汇总208道(六)
    短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天。
  • Spring中Bean注入源码介绍

    Spring中Bean注入源码介绍
    BeanDefinition和Bean 在Spring中Bean的注入涉及两部分: BeanDefinition Bean 两个对象存在先后顺序,先注入BeanDefinition之后才执行Bean对象的注入。 那
  • Java流程控制语句最全汇总(上篇)

    Java流程控制语句最全汇总(上篇)
    本章是关于Java流程控制语句的最全汇总,本篇为汇总上篇。 流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事
  • Java流程控制语句最全汇总(中篇)

    Java流程控制语句最全汇总(中篇)
    本章是关于Java流程控制语句的最全汇总,本篇为汇总中篇。 流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事
  • Mapper与Mapper.xml文件之间匹配的问题介绍

    Mapper与Mapper.xml文件之间匹配的问题介绍
    Mapper与Mapper.xml文件之间匹配问题 这里我们做一个实例 user实体类 1 2 3 4 5 6 public class User { private Integer id; private String username; private String pas
  • Gauva使用ListenableFuture介绍说明
    一、ListenableFuture 介绍 并发是一个困难问题,但是通过强大和强大的抽象能够显著的简化工作。为了简化问题,Gauva使用ListenableFuture扩展了
  • MyBatis一级与二级缓存相关配置

    MyBatis一级与二级缓存相关配置
    1.MyBatis的一级缓存 一级缓存是 SqlSession 级别的,通过同一个 SqlSession 查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,
  • Java阻塞队列BlockingQueue基础与使用
    什么是阻塞队列 阻塞队列本质上还是一种队列,遵循先进先出,后进后出的原则,在此基础上,如果出队时阻塞队列为空,则会使当前线程
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计