首先在项目中引入谷歌zxing的jar包
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.2</version>
</dependency>
二维码工具类如下:
package com;
import com.google.zxing.*;
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 javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
/**
* 二维码工具类
* @author superchen
* @since 2018-05-24
*/
public class QRCodeUtil {
/**
* 生成二维码
*/
public static void createQRCode(String content,String filePath,String fileName,String format) throws WriterException, IOException {
int width = 300; // 图像宽度
int height = 300; // 图像高度
//编码
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 生成矩阵
BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
BarcodeFormat.QR_CODE, width, height, hints);
File outPutImage = new File(filePath+"/"+fileName);
//创建目录
if (outPutImage.getParent() != null && !new File(outPutImage.getParent()).exists()) {
new File(outPutImage.getParent()).mkdirs();
}
//如果图片不存在创建图片
if(!outPutImage.exists())
outPutImage.createNewFile();
Path path = FileSystems.getDefault().getPath(filePath, fileName);
//输出二维码图像
MatrixToImageWriter.writeToPath(bitMatrix, format, path);
System.out.println("二维码生成成功.");
}
/**
* 解析二维码
*/
public static void decode(String filePath) {
//filePath = "D://zxing.png";
BufferedImage image;
try {
image = ImageIO.read(new File(filePath));
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
// 对图像进行解码
Result result = new MultiFormatReader().decode(binaryBitmap, hints);
System.out.println("图片中内容: " + result.getText());
System.out.println("图片中格式: " + result.getBarcodeFormat());
} catch (IOException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
}
}
/**
* 图片转换成Byte数组
*/
public static byte[] image2Byte(String path) {
byte[] data = null;
FileImageInputStream input = null;
ByteArrayOutputStream output =null;
try {
input = new FileImageInputStream(new File(path));
output = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int numBytesRead = 0;
while ((numBytesRead = input.read(buf)) != -1) {
output.write(buf, 0, numBytesRead);
}
data = output.toByteArray();
output.close();
input.close();
} catch (FileNotFoundException ex1) {
ex1.printStackTrace();
} catch (IOException ex1) {
ex1.printStackTrace();
}
finally {
try {
output.close();
input.close();
}catch (Exception e){}
}
return data;
}
/**
* byte数组到图片
*/
public static void byte2Image(byte[] data,String path) {
if (data.length < 3 || path.equals("")) return;
FileImageOutputStream imageOutput = null;
try {
//如果图片不存在创建图片
File imageFile = new File(path);
if(!imageFile.exists())
imageFile.createNewFile();
imageOutput = new FileImageOutputStream(imageFile);
imageOutput.write(data, 0, data.length);
imageOutput.close();
System.out.println("转成图片成功:" + path);
} catch (Exception ex) {
ex.printStackTrace();
}
finally {
try {
imageOutput.close();
}catch (Exception e){}
}
}
}