2021SC@SDUSC

目录

一、项目打包

1.1 安装Maven

1.2 编译jar包

二、在IDEA中生成与解析二维码

2.1 创建Maven项目

2.2 pom.xml文件配置

2.3 生成二维码

2.4 解析二维码

三、Android端功能演示

参考资料


前言:本篇文章主要是在分析源代码之前,进行项目的调试运行,为接下来的代码分析做准备。本人主要负责二维码编码算法,因此,在此后的博客中,我将对package core中的代码进行详细分析。

一、项目打包

1.1 安装Maven

从官方下载安装包并解压。

下载地址:Maven – Download Apache Maven

配置环境变量。详细可看教程: maven安装及配置(详细版)

在命令行输入mvn -v ,出现如下信息则安装成功。

1.2 编译jar包

在命令行中打开Zxing源码的core文件夹,输入 mvn -DskipTests -Dgpg.skip=true install 命令。

 

等待一段时间,出现类似如下信息,则jar包编译成功。

 可以在core文件夹下看到编译好的相应jar包。

javase等jar包的编译也是类似步骤。 

二、在IDEA中生成与解析二维码

2.1 创建Maven项目

在IDEA中创建Maven项目,项目结构如下。

2.2 pom.xml文件配置

    <dependencies>
    	<!--生成二维码必导的包-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.2</version>
            <scope>system</scope>
            <systemPath>D:/zxing-master/core/target/core-3.4.2-SNAPSHOT.jar</systemPath>
        </dependency>
        <!--解析二维码必导的包-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.2.0</version>
        </dependency>
    </dependencies>

2.3 生成二维码

//在指定路径生成一张二维码,内容类型为字符串,可以是普通文本或者是超链接
public class Encode{
    //定义二维码的颜色
    private static final int BLACK = 0xff000000;
    //定义二维码的背景颜色
    private static final int WHITE = 0xffffffff;
    //二维码格式参数集合
    private static final EnumMap<EncodeHintType,Object> hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
    //静态代码块初始化参数,在类加载的时候就初始化,而且在类的生命周期内只初始化一次
    static {
        hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.L);
        // 二维码边界空白大小:1,2,3,4(4为默认,最大)
        hints.put(EncodeHintType.MARGIN,1);
        //设置二维码存储内容的字符集
        hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
    }

    public static void createZXingCodeSaveToDisk(String content,int width,int height,String savePath,String imageType){
        try {
            BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
            //获得二维码的宽高
            int codeWidth = encode.getWidth();
            int codeHeight = encode.getHeight();
            //创建图片
            BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);
            //把二维码里面的信息写到图片里面
            for (int i = 0; i < codeWidth; i++) {
                for (int j = 0; j < codeHeight; j++) {
                    image.setRGB(i,j,encode.get(i,j)?BLACK:WHITE);
                }
            }
            //保存图片到指定位置
            File file = new File(savePath);
            if(!file.exists()){
                //文件不存在则创建
                file.createNewFile();
            }
            ImageIO.write(image,imageType,file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //将字符串"I am FZJ"存储在二维码中
        createZXingCodeSaveToDisk("I am FZJ",300,300,"d://name.jpg","JPEG");
        //将我的博客地址存储在二维码中
        createZXingCodeSaveToDisk("https://blog.csdn.net/m0_52100140",300,300,"d://blog.jpg","JPEG");
    }
}

运行结果如下,可以使用微信扫一扫查看结果。

左侧二维码扫描结果为:I am FZJ

右侧二维码扫描后会跳转到本人博客页面

                    

2.4 解析二维码

//该类主要解析二维码
public class Decode {
    //二维码格式参数集合
    private static final EnumMap<DecodeHintType,Object> hints = new EnumMap<DecodeHintType, Object>(DecodeHintType.class);
    //设置解析二维码后信息的字符集
    static { 
        hints.put(DecodeHintType.CHARACTER_SET,"UTF-8");
    }
    public static String decodeQRCodeForPath(String path){
        //该文件对象映射二维码图片
        File file = new File(path);
        if(file.exists()){
            try {
                return decodeQRCodeStreamForStream(new FileInputStream(file));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return null;
            }
        }
        return null;
    }
    public static String decodeQRCodeStreamForStream(InputStream ins) {
        if(ins != null){
            try {
                //将读取二维码图片的流转为图片对象
                BufferedImage image = ImageIO.read(ins);
                BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
                HybridBinarizer binarizer = new HybridBinarizer(source);
                BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
                MultiFormatReader reader = new MultiFormatReader();
                Result result = reader.decode(binaryBitmap, hints);
                //返回二维码中的文本内容
                String content = result.getText();
                return content;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        String myName = decodeQRCodeForPath("d:/name.jpg");
        System.out.println(myName);
        String myBlog = decodeQRCodeForPath("d:/blog.jpg");
        System.out.println(myBlog);
    }
}

 运行结果如下:

三、Android端功能演示

1、在手机下载安装APP,程序主界面如下所示

2、功能展示

• 扫描条形码

• 扫描二维码

                  

• 生成二维码(以我上一篇博客地址为例,可以使用微信扫一扫)

参考资料

zxing源码编译与运行

springBoot二维码生成案例

Java用ZXing的方式生成与解析二维码

SpringBoot——使用zxing生成二维码和解二维码

利用Spring Boot+zxing,生成二维码

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐