Java使用ZXing生成/解析二维码图片

ZXing是一种开源的多格式1D/2D条形码图像处理库,在Java中的实现。重点是在手机上使用内置摄像头来扫描和解码设备上的条码,而不与服务器通信。然而,该项目也可以用于对桌面和服务器上的条形码进行编码和解码。目前支持这些格式:

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 93
  • Code 128
  • ITF
  • Codabar
  • RSS-14 (all variants)
  • RSS Expanded (most variants)
  • QR Code
  • Data Matrix
  • Aztec (‘beta‘ quality)
  • PDF 417 (‘alpha‘ qua

在这里仅使用它来生成/解析二维码:(解析二维码后续添加)

创建maven项目,在pom.xml文件中添加zxing的jar包依赖:

    <!-- zxingQRcode生成支持包 -->
    <!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.3.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.3.3</version>
    </dependency>

以下为整合的二维码生成工具类:

package com.esheng.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.CharacterSetECI;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * QRCode生成工具类
 * @author: LinWenLi
 * @date: 2018-08-23 12:45:34
 */
public class QRCodeUtils {

    /**
     * 二维码BufferedImage对象生成方法
     * @author LinWenLi
     * @date 2018-08-23 12:51:00
     * @param contents二维码内容
     * @param width二维码图片宽度
     * @param height二维码图片高度
     * @param margin二维码边框(0,2,4,8)
     * @throws Exception
     * @return: BufferedImage
     */
    public static BufferedImage createQRCode(String contents, int width, int height,int margin) throws Exception {
        if (contents == null || contents.equals("")) {
            throw new Exception("contents不能为空。");
        }
        // 二维码基本参数设置
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, CharacterSetECI.UTF8);// 设置编码字符集utf-8
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 设置纠错等级L/M/Q/H,纠错等级越高越不易识别,当前设置等级为最高等级H
        hints.put(EncodeHintType.MARGIN, margin);// 可设置范围为0-10,但仅四个变化0 1(2) 3(4 5 6) 7(8 9 10)
        // 生成图片类型为QRCode
        BarcodeFormat format = BarcodeFormat.QR_CODE;
        // 创建位矩阵对象
        BitMatrix matrix = null;
        try {
            // 生成二维码对应的位矩阵对象
            matrix = new MultiFormatWriter().encode(contents, format, width, height, hints);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        // 设置位矩阵转图片的参数
        MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
        // 位矩阵对象转BufferedImage对象
        BufferedImage qrcode = MatrixToImageWriter.toBufferedImage(matrix, config);
        return qrcode;
    }

    /**
     * 二维码添加LOGO
     * @author LinWenLi
     * @date 2018-08-23 13:17:07
     * @param qrcode
     * @param width二维码图片宽度
     * @param height二维码图片高度
     * @param logoPath图标LOGO路径
     * @param logoSizeMultiple二维码与LOGO的大小比例
     * @throws Exception
     * @return: BufferedImage
     */
    public static BufferedImage createQRCodeWithLogo(BufferedImage qrcode,int width, int height, String logoPath, int logoSizeMultiple) throws Exception {
        File logoFile = new File(logoPath);
        if (!logoFile.exists() && !logoFile.isFile()) {
            throw new Exception("指定的LOGO图片路径不存在!");
        }
        try {
            // 读取LOGO
            BufferedImage logo = ImageIO.read(logoFile);
            // 设置LOGO宽高
            int logoHeight = qrcode.getHeight()/logoSizeMultiple;
            int logowidth = qrcode.getWidth()/logoSizeMultiple;
            // 设置放置LOGO的二维码图片起始位置
            int x = (qrcode.getWidth() - logowidth)/2;
            int y = (qrcode.getHeight() - logoHeight)/2;
            // 新建空画板
            BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 新建画笔
            Graphics2D g = (Graphics2D) combined.getGraphics();
            // 将二维码绘制到画板
            g.drawImage(qrcode, 0, 0, null);
            // 设置不透明度,完全不透明1f,可设置范围0.0f-1.0f
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
            // 绘制LOGO
            g.drawImage(logo, x, y, logowidth, logoHeight, null);
            return combined;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 导出到指定路径
     * @author LinWenLi
     * @date 2018-08-23 12:59:03
     * @param bufferedImage
     * @param filePath图片保存路径
     * @param fileName图片文件名
     * @param formatName图片格式
     * @return: boolean
     */
    public static boolean generateQRCodeToPath(BufferedImage bufferedImage,String filePath, String fileName, String formatName) {
        // 判断路径是否存在,不存在则创建
        File path = new File(filePath);
        if (!path.exists()) {
            path.mkdirs();
        }
        // 路径后补充斜杠
        if (filePath.lastIndexOf("\\") != filePath.length() - 1) {
            filePath = filePath + "\\";
        }
        // 组合为图片生成的全路径
        String fileFullPath = filePath + fileName + "." + formatName;
        boolean result = false;
        try {
            // 输出图片文件到指定位置
            result = ImageIO.write(bufferedImage, formatName, new File(fileFullPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

然后是测试代码:

    public static void main(String[] args) {
        String contents = "二维码内容";
        int width = 220;// 二维码宽度
        int height = 220;// 二维码高度
        int margin = 0;// 二维码边距

        String logoPath = "C:\\Users\\myComputer\\Desktop\\LOGO.jpg";// LOGO图片路径
        int logoSizeMultiple = 3;// 二维码与LOGO的大小比例

        String filePath = "C:\\Users\\myComputer\\Desktop\\";// 指定生成图片文件的保存路径
        String fileName = "imageName";// 生成的图片文件名
        String formatName = "jpg";// 生成的图片格式,可自定义

        try {
            // 生成二维码
            BufferedImage qrcode = QRCodeUtils.createQRCode(contents, width, height,margin);
            // 添加LOGO
            qrcode = QRCodeUtils.createQRCodeWithLogo(qrcode, width, height, logoPath,logoSizeMultiple);
            // 导出到指定路径
            boolean result = QRCodeUtils.generateQRCodeToPath(qrcode, filePath, fileName, formatName);
            System.out.println("执行结果" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

原文地址:https://www.cnblogs.com/new-life/p/9563202.html

时间: 2024-11-14 05:34:25

Java使用ZXing生成/解析二维码图片的相关文章

安卓开发中使用ZXing生成解析二维码

编码示例 package com.wolf_pan.qrcodesample; import android.graphics.Bitmap; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; imp

转:Java生成带有二维码图片的word文档

(一)功能描述:在智能终端的系统中,对所有学员的信息要生成带有二维码图片的报到证与准考证的word文档 (二)实现过程: 1.创建报到证与准考证的word模板,在模板中填充相应的变量. 2.该模板中存在图片,所以在制作模板中应先在相应的位置放一张图片,调整好大小,起到站位的作用 1.创建报到证与准考证的word模板,在模板中填充相应的变量. 2.在该模板中存在图片,所以在制作模板中应先在相应的位置放一张图片,调整好大小,起到 3.将创建好的模板另存为.xml格式的文件 3.此时的.xml格式的文

.net如何解析二维码图片

二维码现在越来越流行,可以使用手机上或其它移动终端上的二维码扫描器软件对着二维码一扫,就可以得到相关信息.在互联网站上,可以找到很多二维码的工具,甚至还有不少在线生成.解析二维码的网站.在业务系统当中,比如档案管理系统中,以前一般都是通过条形码(一维码)来存储档案职工的基本信息,但是存储容量有限.而现在完全可以使用二维码存储更多容量的信息. 我们这里使用了ThoughtWorks.QRCode.dll这个类库,在asp.net项目中引用这个dll文件,就可以使用相关API进行开发. 比如,我们封

用CIFilter生成QRCode二维码图片

CIFilter不仅仅可以用来做滤镜,它还可以用来生成二维码. CIFilterEffect.h + CIFilterEffect.m // // CIFilterEffect.h // CIFilter // // Created by L.S. on 14-5-9. // Copyright (c) 2014年 L.S. All rights reserved. // #import <Foundation/Foundation.h> @interface CIFilterEffect :

几行代码搞定java生成解析二维码功能

最近公司要求扫描二维码和生成二维码的功能.而群里部分网友也提到了.我这里就写了一个demo,和大家分享.代码很简介,希望大家能够喜欢. 网友表示在网上搜索了很多,发现不是代码不全,就是jar不匹配. 我这里共享了一个zxing的2.2版本的例子,也提供了下载地址.实现代码如下: package com.herman.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep

servlet中用ZXing生成条码二维码并输出到web页面的示例

1.生成条码的servlet代码: import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletR

APS.NET MVC4生成解析二维码简单Demo

一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/Scripts/jquery-1.8.2.min.js"></scri

微信支付-无法识别qrcode生成的二维码图片

1.开始使用 table方式,但是还是无法识别二维码  http://www.cnblogs.com/staticed/p/8549316.html var code_url = data.code_url; $("#wechatQrcode").qrcode({ render: "table", //table方式 width: 200, //宽度 height:200, //高度 text: code_url //任意内容 }); 2.后来采用canvas方式,

Java生成二维码解析二维码

package QrCode; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; imp