java实现二维码的生成和解析:QRCode、zxing 两种方式

第一种:QRCode.jar,使用QRCode生成和解析二维码

1.导入jar包

 2.代码

(1)QRCodeUtil .java

  1 import com.swetake.util.Qrcode;
  2 import jp.sourceforge.qrcode.QRCodeDecoder;
  3
  4 import javax.imageio.ImageIO;
  5 import java.awt.*;
  6 import java.awt.image.BufferedImage;
  7 import java.io.File;
  8
  9 public class QRCodeUtil {
 10     /**
 11      *加密:  文字信息 ->二维码.png
 12      * @param content 文字信息
 13      * @param imgPath 二维码路径
 14      * @param imgType 二维码类型:png
 15      * @param size    二维码尺寸
 16      * @throws Exception
 17      */
 18     public void encoderQRCode(String content,String imgPath,String imgType,int size)  throws Exception{
 19         //BufferedImage :内存中的一张图片
 20         BufferedImage bufImg =   qRcodeCommon(content,imgType,size);
 21
 22         File file = new File(imgPath);// "src/二维码.png" --> 二维码.png
 23
 24         //生成图片
 25         ImageIO.write(bufImg, imgType, file);
 26     }
 27
 28     /**
 29      *产生一个二维码的BufferedImage
 30      * @param content 二维码隐藏信息
 31      * @param imgType 图片格式
 32      * @param size    图片大小
 33      * @return
 34      */
 35     private BufferedImage qRcodeCommon(String content, String imgType, int size) throws Exception {
 36         BufferedImage bufImg =null;
 37         //Qrcode对象:字符串->boolean[][]
 38         Qrcode qrCodeHandler = new Qrcode();
 39         //设置二维码的排错率:7% L<M<Q<H30%  :排错率越高,可存储的信息越少;但是对二维码清晰对要求越小
 40         qrCodeHandler.setQrcodeErrorCorrect(‘M‘);
 41         //可存放的信息类型:N:数字、  A:数字+A-Z  B:所有
 42         qrCodeHandler.setQrcodeEncodeMode(‘B‘);
 43         //尺寸:取值范围:1-40
 44         qrCodeHandler.setQrcodeVersion(size);
 45
 46         //"Hello world" -> byte[]"Hello world" -->boolean[][]
 47         byte[] contentBytes = content.getBytes("UTF-8");
 48         boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes);
 49
 50         int imgSize =  67 + 12*(size -1) ;
 51
 52         //BufferedImage:内存中的图片
 53         bufImg = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB );//red green blue
 54
 55         //创建一个画板
 56         Graphics2D gs = bufImg.createGraphics();
 57         gs.setBackground(Color.WHITE);//将画板的背景色设置为白色
 58         gs.clearRect( 0,0, imgSize,imgSize); //初始化
 59         gs.setColor(Color.BLACK);//设置 画板上 图像的颜色(二维码的颜色)
 60
 61         int pixoff = 2 ;
 62
 63         for(int j=0;j<codeOut.length;j++) {
 64             for(int i=0;i<codeOut.length;i++) {
 65                 if(codeOut[j][i]) {
 66                     gs.fillRect(j*3+pixoff , i*3+pixoff, 3, 3);
 67                 }
 68             }
 69         }
 70         //增加LOGO
 71         //将硬盘中的src/logo.png  加载为一个Image对象
 72         Image logo =  ImageIO.read(new File("/src/logo.png")  ) ;
 73         int maxHeight = bufImg.getHeight();
 74         int maxWdith = bufImg.getWidth();
 75
 76         //在已生成的二维码上 画logo
 77         gs.drawImage(logo,imgSize/5*2,imgSize/5*2, maxWdith/5,maxHeight/5 ,null) ;
 78
 79         gs.dispose(); //释放空间
 80         bufImg.flush(); //清理
 81         return bufImg ;
 82     }
 83
 84     //解密:  二维码(图片路径) -> 文字信息
 85     public String decoderQRCode(String imgPath) throws Exception{
 86
 87         //BufferedImage内存中的图片  :硬盘中的imgPath图片 ->内存BufferedImage
 88         BufferedImage bufImg =  ImageIO.read( new File(imgPath) ) ;
 89         //解密
 90         QRCodeDecoder decoder = new QRCodeDecoder() ;
 91
 92         TwoDimensionCodeImage tdcImage = new TwoDimensionCodeImage(bufImg);
 93         byte[] bs = decoder.decode(tdcImage) ;    //bufImg
 94         //byte[] -->String
 95         String content    = new String(bs,"UTF-8");
 96         return content;
 97     }
 98
 99
100 }

(2)TwoDimensionCodeImage .java

 1 import jp.sourceforge.qrcode.data.QRCodeImage;
 2
 3 import java.awt.image.BufferedImage;
 4
 5 public class TwoDimensionCodeImage implements QRCodeImage {
 6     BufferedImage bufImg;  //将图片加载到内存中
 7     public TwoDimensionCodeImage(BufferedImage bufImg) {
 8         this.bufImg = bufImg;
 9     }
10     public int getWidth() {
11         return bufImg.getWidth();
12     }
13
14     public int getHeight() {
15         return bufImg.getHeight();
16     }
17
18     public int getPixel(int x, int y) {
19         return bufImg.getRGB(x,y);
20     }
21 }

(3)Test .java

 1 public class Test {
 2     public static void main(String[] args)  throws Exception{
 3         //生成二维码
 4         /*
 5          * 生成图片的路径        src/二维码.png
 6          * 文字信息、网址信息 :  "helloworld"
 7          */
 8         String imgPath = "e:\\二维码2.png";
 9         String content =  "http://baidu.com";  //扫描二维码后,网页跳转
10
11         //生成二维码
12         /*
13          * 加密:  文字信息 ->二维码
14          * 解密:  二维码 -> 文字信息
15          */
16         QRCodeUtil qrUtil = new QRCodeUtil();
17         //加密:  文字信息 ->二维码
18         qrUtil.encoderQRCode(content, imgPath, "png", 17);
19
20 //           TwoDimensionCode handler = new TwoDimensionCode();
21 //           handler.encoderQRCode(content, imgPath, "png", 7);
22
23
24 //        //解密:  二维码 -> 文字信息
25         String imgContent = qrUtil.decoderQRCode(imgPath) ;
26         System.out.println(imgContent);
27
28
29     }
30 }

第二种:借助Google提供的ZXing Core工具包

1.maven依赖

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

2.代码

(1)ZXingUtil .java

 1 import com.google.zxing.*;
 2 import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
 3 import com.google.zxing.common.BitMatrix;
 4 import com.google.zxing.common.HybridBinarizer;
 5 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 6 import jp.sourceforge.qrcode.util.Color;
 7
 8 import javax.imageio.ImageIO;
 9 import java.awt.image.BufferedImage;
10 import java.io.File;
11 import java.util.HashMap;
12 import java.util.Hashtable;
13 import java.util.Map;
14
15 public class ZXingUtil {
16     public static void encodeImg(String imgPath,String format,String content,int width,int height,String logo) throws Exception {
17         Hashtable<EncodeHintType,Object > hints = new Hashtable<EncodeHintType,Object>() ;
18         //排错率  L<M<Q<H
19         hints.put( EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H) ;
20         //编码
21         hints.put( EncodeHintType.CHARACTER_SET, "utf-8") ;
22         //外边距:margin
23         hints.put( EncodeHintType.MARGIN, 1) ;
24         /*
25          * content : 需要加密的 文字
26          * BarcodeFormat.QR_CODE:要解析的类型(二维码)
27          * hints:加密涉及的一些参数:编码、排错率
28          */
29         BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width,height, hints);
30         //内存中的一张图片:此时需要的图片 是二维码-> 需要一个boolean[][] ->BitMatrix
31         BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
32
33         for(int x=0;x<width;x++) {
34             for(int y=0;y<height;y++) {
35                 image.setRGB(x, y,     (bitMatrix.get(x,y)? Color.BLACK:Color.WHITE)  );
36             }
37         }
38         //画logo
39         image = LogoUtil.logoMatrix(image, logo) ;
40         //string->file
41         File file = new File(imgPath);
42         //生成图片
43         ImageIO.write(image, format, file);
44     }
45
46     //解密:二维码->文字
47     public static void decodeImg(File file) throws Exception {
48         if(!file.exists()) return ;
49         //file->内存中的一张图片
50         BufferedImage imge = ImageIO.read(file)  ;
51
52         MultiFormatReader formatReader = new MultiFormatReader() ;
53         LuminanceSource source = new BufferedImageLuminanceSource(imge);
54         Binarizer binarizer = new HybridBinarizer(source);
55         BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
56         //图片 ->result
57         Map map = new HashMap();
58         map.put(EncodeHintType.CHARACTER_SET, "utf-8") ;
59         Result result = formatReader.decode(binaryBitmap  ,map ) ;
60         System.out.println("解析结果:"+ result.toString());
61     }
62
63 }

(2)LogoUtil .java

 1 import javax.imageio.ImageIO;
 2 import java.awt.*;
 3 import java.awt.geom.RoundRectangle2D;
 4 import java.awt.image.BufferedImage;
 5 import java.io.File;
 6 import java.io.IOException;
 7
 8 public class LogoUtil {
 9     //传入logo、二维码 ->带logo的二维码
10     public  static BufferedImage  logoMatrix( BufferedImage matrixImage,String logo ) throws IOException {
11         //在二维码上画logo:产生一个  二维码画板
12         Graphics2D g2 = matrixImage.createGraphics();
13
14         //画logo: String->BufferedImage(内存)
15         BufferedImage logoImg = ImageIO.read(new File(logo));
16         int height = matrixImage.getHeight();
17         int width = matrixImage.getWidth();
18         //纯logo图片
19         g2.drawImage(logoImg, width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, null);
20
21         //产生一个 画 白色圆角正方形的 画笔
22         BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
23         //将画板-画笔 关联
24         g2.setStroke(stroke);
25         //创建一个正方形
26         RoundRectangle2D.Float round = new RoundRectangle2D.Float(width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
27         g2.setColor(Color.WHITE);
28         g2.draw(round);
29
30         //灰色边框
31         BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
32         g2.setStroke(stroke2);
33         //创建一个正方形
34         RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(width * 2 / 5 + 2, height * 2 / 5 + 2, width * 1 / 5 - 4, height * 1 / 5 - 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
35 //        Color color = new Color(128,128,128) ;
36         g2.setColor(Color.GRAY);
37         g2.draw(round2);
38
39         g2.dispose();
40         matrixImage.flush();
41
42         return matrixImage;
43     }
44 }

(3)test.java

 1 import java.io.File;
 2
 3 public class test {
 4     public static void main(String[] args) throws Exception {
 5         String imgPath = "src/二维码12.png";
 6         String content = "helloworld你好";
 7         String logo = "src/logo.png";
 8         //加密:文字信息->二维码
 9         ZXingUtil.encodeImg(imgPath, "png",content, 430, 430,logo);
10         //解密:二维码  ->文字信息
11         ZXingUtil.decodeImg(new File(imgPath));
12     }
13 }

(效果图)

原文地址:https://www.cnblogs.com/codingcc1/p/11099788.html

时间: 2024-10-21 20:25:28

java实现二维码的生成和解析:QRCode、zxing 两种方式的相关文章

关于java的二维码的生成与解析

本文说的是通过zxing实现二维码的生成与解析,看着很简单,直接上代码 import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.HashMap; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiForm

java实现二维码的生成与解析

二维码的生成及解析的低层实现并不简单,我们只需要知道怎么使用就可以了,参考博客:https://blog.csdn.net/jam_fanatic/article/details/82818857 1.maven中jar包引用com.google.zxing: 2.创建QRCodeUtil二维码工具类,使用谷歌提供的帮助类BufferedImageLuminanceSource绘制二维码. 生成二维码:QRCodeUtil.encode(编码到二维码中的内容, 嵌入二维码的图片路径, 生成的二维

Java 条形码 二维码 的生成与解析

https://www.cnblogs.com/zhaoyhBlog/p/6236949.html?utm_source=itdadao&utm_medium=referral 原文地址:https://www.cnblogs.com/BelieveFish/p/11112484.html

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

写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再逗留下去了,如此而已.受过风吹雨打之后会有很多独有的感受及思考,主见开始生发并在摇摆中坚定,想来这就是成长了,嗯--就算是成长吧,呵呵! 话说微软的 .net core 3.0 即将发布了,作为一个码农,还是要关心一下的.从 .net core 2.0 及MySql官方开始支持 .net core

java二维码的生成与解析代码

二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍. 2.  编码范围广 该条码可以把图片.声音.文字.签字.指纹等可以数字化的信息进行编码,用条码表示出来:可以表示多种语言文字:可表示图像数据. 3.  容错能力强,具有纠错功能 这使得二维条码因穿孔.污损等引起局部损坏时,照样可以正确

Java_util_02_二维码的生成与解析

1.引入jar包 zxing-core-1.7.jar  :   http://viralpatel.net/blogs/download/jar/zxing-core-1.7.jar zxing-javase-1.7.jar :  http://viralpatel.net/blogs/download/jar/zxing-j2se-1.7.jar 2.工具类—QRCodeUtil.java 1 package com.ray.util; 2 3 import java.awt.image.B

二维数组的认识及其表示元素的两种方式

/* ============================================================================ Name : TeatArr.c Author : lf Version : Copyright : Your copyright notice Description : 二维数组的认识以及其表示元素的两种方式 备注说明 1 要理解二维数组的存储方式. 2 实际上利用a[i][j]的方式并不"正统",这是这靠近我们的 常识一些

Java实现二维码技术探讨。

Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 能够用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourceforge.net/

java实现二维码生成的几个方法

1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourceforge.net/projects/barcode