前言:曾经有做过不少微信公众号和移动网站的项目,对二维码还算有点了解,刚收到这个任务的时候就想着竟然要用二维码存文本,那就得先考究一下这小小的二维码到底能存多少的东西了。
需求:使用二维码存放文本(xml、json),手机通过扫描二维码获取该文本信息。

什么是二维码(网络资料):

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
编码二维码 就是将给定的一些文字、数字转换为一张经过特定处理的图片,而解析二维码则相反,就是将一张经过编码的图片解析为数字或者文字。
一个二维码可容纳多达 1850个大写字母 ≈ 2710个数字 ≈ 1108个字节 ≈ 500多个汉字,比普通条码信息容量约高几十倍。

开发

zxing

首先找到的框架是google的zxing

<!-- 谷歌 1D/2D条形码图像处理库  -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version>
</dependency>

操作了一波,写了个工具类QRUtil

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;/*** QRCode生成工具类* @author: stone* @create: 2019-08-08 14:34**/
public class QRCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// 二维码尺寸private static final int QRCODE_SIZE = 600;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插入图片QRCodeUtil.insertImage(image, imgPath, needCompress);return image;}private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + "   该文件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);mkdirs(destPath);// String file = new Random().nextInt(99999999)+".jpg";// ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);return image;}public static void mkdirs(String destPath) {File file = new File(destPath);// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath) throws Exception {QRCodeUtil.encode(content, imgPath, destPath, false);}public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, false);}public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output) throws Exception {QRCodeUtil.encode(content, null, output, false);}public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}public static void main(String args[]){// 存放在二维码中的内容String aimTextPath = "E:\\QRCode导出文件夹\\《最长的电影》.txt";StringBuilder result = new StringBuilder();try{FileInputStream fis = new FileInputStream(aimTextPath);InputStreamReader isr = new InputStreamReader(fis, "GBK");BufferedReader br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null) {result.append(line);result.append("\r\n"); // 补上换行符}br.close();}catch(Exception e){e.printStackTrace();}String text = result.toString();// 嵌入二维码的图片路径String imgPath = "E:\\QRCode导出文件夹\\logo.jpg";// 生成的二维码的路径及名称String destPath = "E:\\QRCode导出文件夹\\img.jpg";try {//生成二维码QRCodeUtil.encode(text, imgPath, destPath, true);// 解析二维码String str = QRCodeUtil.decode(destPath);// 打印出解析出的内容System.out.println(str);}catch (Exception e){e.printStackTrace();}}
}

代码很简单,随便看看都能看懂。
经过测试哦,自己写的解析二维码的那段代码并不是很高效,如果当前二维码中存储的内容比较满的话,这段解析方法会报错,具体是zxing读取不到内容,没有深究。比如如下二维码:

里面存了《最长的电影》这首歌的全歌词,算上换行符总字符314个。由于对业务还不是很清楚,这里的314个不知道属于什么级别,但是感觉应该够用。
可是我是不满足这套工具类了,于是又找到另一个工具库。

hutool

这对于java工程师来说算是一个宝藏了,里面封装了五花八门的util,刚找到这个工具库的时候我直接笑出了声…咳嗯。这里面也包含了对com.google.zxing的封装,不试不知道,它里面封装的方法比我上面写的效率高呢…这个包也开源,可以看到里面的具体内容,但是由于我公司的项目已经导入了hutool这个包,所以在这个基础上就直接使用hutool比我再导入zxing并进行封装会更节省项目体积。
唠嗑了这么多,贴hutool的官方api吧。

Hutool官网:https://hutool.cn/
QrCodeUtil api:https://apidoc.gitee.com/loolly/hutool/

maven引用:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.15</version>
</dependency>

版权声明:文章内容总结于网络,如侵犯到原作者权益,请与我联系删除或授权事宜

Java生成和解析二维码相关推荐

  1. java生成以及解析二维码

    java生成以及解析二维码 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 ...

  2. Java生成和解析二维码工具类(简单经典)

    Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  3. java生成和解析二维码实战——QRCode

    直接上代码,以下程序可直接运行: package qrcode;import java.awt.Color; import java.awt.Graphics2D; import java.awt.i ...

  4. Java生成与解析二维码

    1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...

  5. java生成与解析二维码 支持插入图片与文字

    1.依赖: <!-- https://mvnrepository.com/artifact/com.google.zxing/core --><dependency><g ...

  6. java 生成、解析二维码并在二维码中添加样式

    https://blog.csdn.net/yxj13935213026/article/details/81017902

  7. Java实现生成和解析二维码

    Java实现生成和解析二维码 文章目录 Java实现生成和解析二维码 一.建立项目 二.创建工具类 三.创建启动类 一.建立项目 首先需要创建一个普通的 Maven 项目,在这里我用的是 google ...

  8. java利用zxing来生成和解析二维码,支持中文

    java在二维码的生成和解析上,网上有些人说如果要解析中文,得去修改工具包的Encoder类中的 static final String DEFAULT_BYTE_MODE_ENCODING = &q ...

  9. 使用zxing生成与解析二维码

    随着二维码的普及,二维码在生活中的使用使用的场景也越来越来多,本文章就来介绍使用zxing来生成与解析二维码.生成二维码的开源项目很多,选择zxing则是因为其出自Google并且长期有人进行维护,值 ...

最新文章

  1. 大盘点 | 2020年5篇目标检测算法最佳综述
  2. mysql 3.6.4_TOMCAT5+MYSQL5+JIRA3.6.4配置说明
  3. 【FPGA】ROM/EPROM的设计(使用加载文件的方式初始化)
  4. 【深度学习】利用神网框架分割病理切片中的癌组织(胃)
  5. 【网络安全】无需SOCKS支持,帮助广大渗透测试人员建立一条隐蔽的通信信道
  6. JavaSE(十九)——equals() 和 == 的区别
  7. 显卡测试软件毛毛虫,超龙超龙,与众不同,顶流配备,散热一流,3070Ti超龙旗舰版评测...
  8. Entity Framework 简介
  9. 数据交互智能终端设想
  10. Laravel 中使用Goutte + GuzzleHttp 组件设置 headers无效的原因探究以及解决方案
  11. 首次!阿里达摩院将Pure Transformer 应用于目标重识别ReID!
  12. win7 IE9 internet explorer[IE] [IE 9]已停止工作
  13. Mysql Order By 字符串排序,mysql 字符串order by
  14. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_5_Stream流中的常用方法_map...
  15. 谷歌金山词霸CBSText.dll文件丢失解决方法
  16. ssm图书馆管理系统
  17. chrome android版 插件下载,谷歌chrome安卓版
  18. 云服务器部署 Web 项目
  19. ARM7、ARM9、ARM11、ARM-Cortex的关系
  20. 大数据征信是个人信用风险管理的必然趋势

热门文章

  1. 使用JIRA管理项目工单
  2. UE4 4.26 Pixel Streaming 应用场景
  3. 射频中IM3、IIP3、OIP3、G、P1dB指标计算
  4. 如何做推广?利用今日头条吸引大量精准粉丝
  5. Problem B. L04-02 一元二次方程的根(重点在于求虚根---初学简单版)
  6. python保存图片到指定路径_python 抓取页面数据,并保存图片文本到指定目录文件夹...
  7. aspose.word删除分页符
  8. SpringCloud_JZZ_MBY
  9. 80C51引脚功能及片内RAM、片内ROM简介
  10. 基于微信小程序的个人健康打卡系统设计与实现-计算机毕业设计源码+LW文档