二维条形码的生成与解析

简介:

Xml代码

1
2
3
4
5
6
7
8
9
10
< dependency >
     < groupId >com.google.zxing</ groupId >
     < artifactId >core</ artifactId >
     < version >1.7</ version >
</ dependency >
< dependency >
     < groupId >com.google.zxing</ groupId >
     < artifactId >javase</ artifactId >
     < version >1.7</ version >
</ dependency >

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
package  util.qrcode;
import  java.awt.image.BufferedImage;
import  java.io.Closeable;
import  java.io.File;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.OutputStream;
import  java.net.URL;
import  java.util.Hashtable;
import  java.util.List;
import  javax.imageio.ImageIO;
import  com.google.zxing.BarcodeFormat;
import  com.google.zxing.BinaryBitmap;
import  com.google.zxing.EncodeHintType;
import  com.google.zxing.LuminanceSource;
import  com.google.zxing.MultiFormatReader;
import  com.google.zxing.MultiFormatWriter;
import  com.google.zxing.NotFoundException;
import  com.google.zxing.Result;
import  com.google.zxing.WriterException;
import  com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import  com.google.zxing.client.j2se.MatrixToImageWriter;
import  com.google.zxing.common.BitMatrix;
import  com.google.zxing.common.HybridBinarizer;
import  com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public  class  QRCodeUtils {
     /** 私有构造方法 */
     private  QRCodeUtils() {  super (); }
           
     private  static  final  Hashtable<EncodeHintType, Object> ZXING_HINTS;
           
     static  {
         ZXING_HINTS =  new  Hashtable<EncodeHintType, Object>();
         ZXING_HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
         ZXING_HINTS.put(EncodeHintType.CHARACTER_SET,  "UTF-8" );
     }
         public  void  encode(String contents, File file,String filePostfix, BarcodeFormat format,  int  width,  int  height, Map<EncodeHintType, ?> hints) {
         Hashtable hintsw =  new  Hashtable();
             // 指定纠错等级
             hintsw.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
             // 指定编码格式
             hintsw.put(EncodeHintType.CHARACTER_SET,  "UTF-8" );   //要使用utf8 才能编码,并解码中文!
             try  {
                 BitMatrix bitMatrix =  new  MultiFormatWriter().encode(contents,
                         BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
                 MatrixToImageWriter.writeToFile(bitMatrix,  "png" , file);
         
             catch  (Exception e) {
                 e.printStackTrace();
             }
     }
     /**
      * 将二维码写入数据流
      *
      * @param out 数据流
      * @param lines 数据
      * @param width 二维码宽度
      * @param height 二维码高度
      */
     public  static  void  writeToOutputStream(OutputStream out, List<String> lines,  int  width,  int  height) {
         StringBuilder sb =  new  StringBuilder();
         for  ( int  i =  0 ; i < lines.size(); i ++) {
             sb.append(lines.get(i));
             if  (i != lines.size() -  1 ) {
                 sb.append( "\n" );
             }
         }
         writeToOutputStream(out, sb.toString(), width, height);
     }
           
     /**
      * 将二维码写入数据流
      *
      * @param out 数据流
      * @param contents 数据
      * @param width 二维码宽度
      * @param height 二维码高度
      */
     public  static  void  writeToOutputStream(OutputStream out, String contents,  int  width,  int  height) {
         try  {
             BitMatrix bitMatrix =  new  MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
             MatrixToImageWriter.writeToStream(bitMatrix,  "png" , out);
         catch  (WriterException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         catch  (IOException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
     }
           
     /**
      * 将二维码写入文件
      *
      * @param file 文件
      * @param lines 数据
      * @param width 二维码宽度
      * @param height 二维码高度
      */
     public  static  void  writeToFile(File file, List<String> lines,  int  width,  int  height) {
         StringBuilder sb =  new  StringBuilder();
         for  ( int  i =  0 ; i < lines.size(); i ++) {
             sb.append(lines.get(i));
             if  (i != lines.size() -  1 ) {
                 sb.append( "\n" );
             }
         }
         writeToFile(file, sb.toString(), width, height);
     }
           
     /**
      * 将二维码写入文件
      *
      * @param file 文件
      * @param contents 数据
      * @param width 二维码宽度
      * @param height 二维码高度
      */
     public  static  void  writeToFile(File file, String contents,  int  width,  int  height) {
         try  {
             BitMatrix bitMatrix =  new  MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, ZXING_HINTS);
             MatrixToImageWriter.writeToFile(bitMatrix,  "png" , file);
         catch  (WriterException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         catch  (IOException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
     }
     /**
      * 解析二维码
      *
      * @param image 图片
      * @return 信息
      */
     public  static  String decode(BufferedImage image) {
         Result result =  null ;
         LuminanceSource source =  new  BufferedImageLuminanceSource(image);
         BinaryBitmap bitmap =  new  BinaryBitmap( new  HybridBinarizer(source));
         try  {
             result =  new  MultiFormatReader().decode(bitmap, ZXING_HINTS);
         catch  (NotFoundException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
         return  result.getText();
     }
           
     /**
      * 解析二维码
      *
      * @param file 图片
      * @return 信息
      */
     public  static  String decode(File file) {
         BufferedImage image =  null ;
         try  {
             image = ImageIO.read(file);
         catch  (IOException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
         return  decode(image);
     }
           
     /**
      * 解析二维码
      *
      * @param input 图片
      * @return 信息
      */
     public  static  String decode(InputStream input) {
         BufferedImage image =  null ;
         try  {
             image = ImageIO.read(input);
         catch  (IOException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
         return  decode(image);
     }
           
     /**
      * 解析二维码
      *
      * @param url 图片
      * @return 信息
      */
     public  static  String decode(URL url) {
         BufferedImage image =  null ;
         try  {
             image = ImageIO.read(url);
         catch  (IOException e) {
             throw  new  RuntimeException(e.getMessage(), e);
         }
         return  decode(image);
     }
           
     /**
      * 关闭
      *
      * @param closeable 关闭对象
      */
     public  static  void  closeQuietly(Closeable closeable) {
         if  (closeable ==  null return ;
         try  { closeable.close(); }  catch  (Exception e) {}
     }























本文转自yunlielai51CTO博客,原文链接: http://blog.51cto.com/4925054/1354838 ,如需转载请自行联系原作者
相关文章
|
存储 .NET
asp.net 生成、解析条形码和二维码
原文 asp.net 生成、解析条形码和二维码 一、条形码 一维码,俗称条形码,广泛的用于电子工业等行业。比如我们常见的书籍背面就会有条形码,通过扫描枪等设备扫描就可以获得书籍的ISBN(International standard book number,国际标准书号)。
1486 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
588 2
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
956 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1578 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
630 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
1453 2
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多
  • DNS