博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java使用ZXing生成/解析二维码图片
阅读量:5152 次
发布时间:2019-06-13

本文共 6547 字,大约阅读时间需要 21 分钟。

 

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包依赖:

com.google.zxing
core
3.3.3
com.google.zxing
javase
3.3.3

 

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

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
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; }}
View Code

 

然后是测试代码:

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

你可能感兴趣的文章
在js在添版本号
查看>>
sublime3
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
Hdu - 1002 - A + B Problem II
查看>>
Android设置Gmail邮箱
查看>>
js编写时间选择框
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
Attributes.Add用途与用法
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>