二维码的生成和解析(qrcode 和 zxing)

本文主要说明了 qrcode 和 zxing 两种方式生成二维码。原创,复制可用。直接上代码…

生成解析工具

package com.feng.work.util.qrcode;import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** 二维码生成工具类** @author Xuefeng_Wen* @data 2018-03-07* QRCode*/public class QRCodeUtil {//二维码颜色private static final int BLACK = 0xFF000000;//二维码颜色private static final int WHITE = 0xFFFFFFFF;/*** <span style="font-size:18px;font-weight:blod;">ZXing 方式生成二维码</span>** @param text       <a href="javascript:void();">二维码内容</a>* @param width      二维码宽* @param height     二维码高* @param outPutPath 二维码生成保存路径* @param imageType  二维码生成格式*/public static void zxingCodeCreate(String text, int width, int height, String outPutPath, String imageType) {Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();//设置编码字符集his.put(EncodeHintType.CHARACTER_SET, "utf-8");try {//1、生成二维码BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, his);//2、获取二维码宽高int codeWidth = encode.getWidth();int codeHeight = encode.getHeight();//3、将二维码放入缓冲流BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);for (int i = 0; i < codeWidth; i++) {for (int j = 0; j < codeHeight; j++) {//4、循环将二维码内容定入图片image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);}}File outPutImage = new File(outPutPath);//如果图片不存在创建图片if (!outPutImage.exists())outPutImage.createNewFile();//5、将二维码写入图片ImageIO.write(image, imageType, outPutImage);} catch (WriterException e) {e.printStackTrace();System.out.println("二维码生成失败");} catch (IOException e) {e.printStackTrace();System.out.println("生成二维码图片失败");}}/*** <span style="font-size:18px;font-weight:blod;">二维码解析</span>** @param analyzePath 二维码路径* @return* @throws IOException*/@SuppressWarnings({"rawtypes", "unchecked"})public static Object zxingCodeAnalyze(String analyzePath) throws Exception {MultiFormatReader formatReader = new MultiFormatReader();Object result = null;try {File file = new File(analyzePath);if (!file.exists()) {return "二维码不存在";}BufferedImage image = ImageIO.read(file);LuminanceSource source = new BufferedImageLuminanceSource(image);Binarizer binarizer = new HybridBinarizer(source);BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);Map hints = new HashMap();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");result = formatReader.decode(binaryBitmap, hints);} catch (NotFoundException e) {e.printStackTrace();}return result;}/*** <span style="font-size:18px;font-weight:blod;">QRCode 方式生成二维码</span>** @param content  二维码内容* @param imgPath  二维码生成路径* @param version  二维码版本* @param logoPath 是否生成Logo图片    为NULL不生成*/public static void QRCodeCreate(String content, String imgPath, int version, String logoPath) {try {Qrcode qrcodeHandler = new Qrcode();//设置二维码排错率,可选L(7%) M(15%) Q(25%) H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小qrcodeHandler.setQrcodeErrorCorrect('M');//N代表数字,A代表字符a-Z,B代表其他字符qrcodeHandler.setQrcodeEncodeMode('B');//版本1为21*21矩阵,版本每增1,二维码的两个边长都增4;所以版本7为45*45的矩阵;最高版本为是40,是177*177的矩阵qrcodeHandler.setQrcodeVersion(version);//根据版本计算尺寸int imgSize = 67 + 12 * (version - 1);byte[] contentBytes = content.getBytes("gb2312");BufferedImage bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);Graphics2D gs = bufImg.createGraphics();gs.setBackground(Color.WHITE);gs.clearRect(0, 0, imgSize, imgSize);// 设定图像颜色 > BLACKgs.setColor(Color.BLACK);// 设置偏移量 不设置可能导致解析出错int pixoff = 2;// 输出内容 > 二维码if (contentBytes.length > 0 && contentBytes.length < 130) {boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);for (int i = 0; i < codeOut.length; i++) {for (int j = 0; j < codeOut.length; j++) {if (codeOut[j][i]) {gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);}}}} else {System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,130 ]. ");}/* 判断是否需要添加logo图片 */if (logoPath != null) {File icon = new File(logoPath);if (icon.exists()) {int width_4 = imgSize / 4;int width_8 = width_4 / 2;int height_4 = imgSize / 4;int height_8 = height_4 / 2;Image img = ImageIO.read(icon);gs.drawImage(img, width_4 + width_8, height_4 + height_8, width_4, height_4, null);gs.dispose();bufImg.flush();} else {System.out.println("Error: login图片不存在!");}}gs.dispose();bufImg.flush();//创建二维码文件File imgFile = new File(imgPath);if (!imgFile.exists())imgFile.createNewFile();//根据生成图片获取图片String imgType = imgPath.substring(imgPath.lastIndexOf(".") + 1, imgPath.length());// 生成二维码QRCode图片ImageIO.write(bufImg, imgType, imgFile);} catch (Exception e) {e.printStackTrace();}}/*** <span style="font-size:18px;font-weight:blod;">QRCode二维码解析</span>** @param codePath 二维码路径* @return 解析结果*/public static String QRCodeAnalyze(String codePath) {File imageFile = new File(codePath);BufferedImage bufImg = null;String decodedData = null;try {if (!imageFile.exists())return "二维码不存在";bufImg = ImageIO.read(imageFile);QRCodeDecoder decoder = new QRCodeDecoder();decodedData = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "gb2312");} catch (IOException e) {System.out.println("Error: " + e.getMessage());e.printStackTrace();} catch (DecodingFailedException dfe) {System.out.println("Error: " + dfe.getMessage());dfe.printStackTrace();}return decodedData;}}

测试类

package com.feng.work.util.qrcode;/*** 二维码生成测试类** @author Xuefeng_Wen* @data 2018-03-07* QRCodeTest*/public class QRCodeTest {public static void main(String[] args) throws Exception {/** QRcode 二维码生成测试 */QRCodeUtil.QRCodeCreate("http://blog.csdn.net/eileen_crystal", "E://qrcode.jpg", 15, "E://icon.jpg");/** QRcode 二维码解析测试 */String qrcodeAnalyze = QRCodeUtil.QRCodeAnalyze("E://qrcode.jpg");System.out.println("qrcodeAnalyze----->" + qrcodeAnalyze);/** ZXingCode 二维码生成测试*/QRCodeUtil.zxingCodeCreate("http://blog.csdn.net/eileen_crystal", 300, 300, "E://zxingcode.jpg", "jpg");/** ZxingCode 二维码解析 */String zxingAnalyze = QRCodeUtil.zxingCodeAnalyze("E://zxingcode.jpg").toString();System.out.println("zxingAnalyze----->" + zxingAnalyze);System.out.println("success");}
}

QRCode二维码解析辅助类

package com.up72.work.util.qrcode;import java.awt.image.BufferedImage;import jp.sourceforge.qrcode.data.QRCodeImage;/*** 二维码解析** @author Xuefeng_Wen* @data 2018-03-07* TwoDimensionCodeImage*/
public class TwoDimensionCodeImage implements QRCodeImage {BufferedImage bufImg;public TwoDimensionCodeImage(BufferedImage bufImg) {this.bufImg = bufImg;}@Overridepublic int getHeight() {return bufImg.getHeight();}@Overridepublic int getPixel(int x, int y) {return bufImg.getRGB(x, y);}@Overridepublic int getWidth() {return bufImg.getWidth();}}

以上代码经过测试可以,jar详见 ↓

https://download.csdn.net/download/eileen_crystal/10274149

二维码的生成和解析(qrcode 和 zxing)相关推荐

  1. .net core 的图片处理及二维码的生成及解析

    写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再 ...

  2. java利用core 工具实现二维码的生成与解析

    java利用core 工具实现二维码的生成与解析 简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反, ...

  3. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  4. java实现二维码的生成和解析包含工具类

    1.下载jar包( jdk1.7) 链接:https://pan.baidu.com/s/1LVq_zGsp_Po8V456h1TVmA 提取码:vqyd 2.工具类Utils.java packag ...

  5. 二维码的生成与解析示例 生成二维码

    二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或 ...

  6. 二维码的生成和解析原理

    二维码结构 1.版本信息:version1(21*21),version2,...,version40,一共40个版本.版本代表每行有多少模块,每一个版本比前一个版本增加4个码元,计算公式为(n-1) ...

  7. 一维码和二维码的生成与解析

    转载至https://blog.csdn.net/weixin_38902950/article/details/86771397 注意: 1.Zxing生成的条形码下边没有数字,barcode4j有 ...

  8. C# 二维码的生成 Open Source QRCode Library

    一.简单点的 public  class QRCode     {         /// <summary>         /// 根据ID生成一个二维码         /// // ...

  9. js二维码样式生成插件easy.qrcode.js

    下载地址easy.qrcode.js二维码生成插件是一款原生js二维码类库,可以生产成各式各样的二维码样式.支持JavaScript模块化加载.支持点状风格,Logo,背景图片,规则色彩控制,标题等设 ...

最新文章

  1. 1025 PAT Ranking
  2. 17福师《计算机应用基础,17春福师《计算机应用基础》在线作业一.doc
  3. 如何以及为什么序列化Lambda
  4. 零基础学java web开发pdf_新手学Java Web开发.pdf
  5. 嘀嗒还是滴答_2021年顺风车车主口碑榜!滴滴、滴答、一喂顺风车成TOP3
  6. python Exception(异常处理)
  7. IBM软件三大发力点推进“软”实力着陆中国
  8. [转] 计算机视觉领域稍微容易中的期刊
  9. hdu 2986 Ballot evaluation (Simulation)
  10. python就业方向-看完Python这五大就业方向的薪资待遇,你选择哪个?
  11. 如何将矩阵化为约旦标准型_【解题方法】矩阵初等变换的应用
  12. 基于SpringBoot的外卖点餐小程序 餐厅点单小程序
  13. matlab怎么表示对角阵,matlab – 如何基于每一行将矩阵转换为一堆对角矩阵?
  14. VR电竞游戏在英特尔®架构上的用户体验优化
  15. linux解压缩包命令
  16. 微信公众平台接口调试工具json格式不对怎么搞_一步步教你打造微信公众号文章爬虫(3)-批量下载...
  17. 关于jdk11没有jre文件夹
  18. TSGCTF 2021 Welcome to TSG CTF! WP
  19. 手机微信下载的文件存储在哪一个文件夹?
  20. 二级计算机office的公式,计算机二级office-Excel常用公式

热门文章

  1. nachos源码阅读 (内存管理)
  2. 美加净与大白兔跨界合作奶糖味润唇膏成社交网络爆款
  3. 命令行错误提示--系统找不到指定的文件
  4. 动手学深度学习——链式法则、自动求导及实现
  5. 融合蓝牙与IoT 拓展Wi-Fi商业价值
  6. 望尽天涯路--从理财角度看高可用
  7. motan学习笔记 一 微博轻量级RPC框架Motan
  8. 关于MOS管栅极和栅介质(氧化物)的材料选择
  9. 函数极限:函数在一点处的极限
  10. 百度网盘文件下载工具