关于二维码的设计实际上就是利用了上面例4中的下载,二维码需要由第三方类库生成,然后由OutputStream将二维码发送到浏览器上,在浏览器中通过请求当前产生二维码的controller类,从而能够在客户端看到二维码。要想使用二维码第三方类库,你需要导入下面的依赖:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
第二步:设计二维码工具类
package com.yx.yzh.utils;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import com.google.zxing.common.BitMatrix;
/**
* 二维码生成
* @author Administrator
*
*/
public class MatrixToImageWriter {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private MatrixToImageWriter() {
}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
}
}
第三步:测试案例
@RequestMapping("/downOrderInfoOfQRCode")
public void downOrderInfoOfQRCode(HttpServletResponse response, HttpServletRequest request) throws Exception {
//生成二维码图片
String text = "1234567890"; // 二维码内容
int width = 300; // 二维码图片宽度
int height = 300; // 二维码图片高度
String format = "jpg";// 二维码的图片格式
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 内容所使用字符集编码
//内容所使用编码
//hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
// 生成二维码
//File outputFile = new File("d:" + File.separator + "new.gif");
File outputFile = new File("C:\\Users\\Administrator\\Desktop\\test\\3.jpg");
MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);
//获取刚才生成的图片,返回二维码图片流:前端通过访问该接口就可以访问这个图片流,从而获取到图片
String fileName = "C:\\Users\\Administrator\\Desktop\\test\\3.jpg";
File file = new File(fileName);
FileInputStream inputStream = new FileInputStream(file);
byte[] data = new byte[(int)file.length()];
inputStream.read(data);
inputStream.close();
response.setContentType("image/jpg");
//输出流
OutputStream stream = response.getOutputStream();
//写入图片数据
stream.write(data);
stream.flush();
stream.close();
}
这时,我们在浏览器中输入该controller的访问路径就可以查看二维码信息了。这里其实就是一个下载的过程。
(2)封装
package com.yx.yzh.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Hashtable;
import javax.servlet.http.HttpServletResponse;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.yx.yzh.enums.QRCodePictureTypeEnum;
//QR (quick response) code
/**
* @className QRCodeUtils
* @description 二维码工具类
* @author yzh
* @date 2018-10-15
*/
public class QRCodeUtils {
private Hashtable<EncodeHintType, String> hints;
/**二维码的图片格式*/
private String qRCodeFormat;
/**
* @functionName QRCodeUtils
* @description 构造器,初始化信息
* @author yzh
* @date 2018-10-15
*/
public QRCodeUtils(){
hints = new Hashtable<EncodeHintType, String>();
qRCodeFormat = "";
}
/**
* @functionName uploadQRCodeImage
* @description 生成并上传二维码图片
* @author yzh
* @param QRCodeContent 二维码的内容
* @param QRPicWidth 二维码图片宽度
* @param QRHeight 二维码图片高度
* @param qRCodePictureTypeEnum 二维码格式枚举(防止用户手动输入错误的类型)
* @param fileName 文件名
* @param outputFilePath 二维码图片输出路经
* @date 2018-10-15
*/
public void uploadQRCodeImage(String QRCodeContent,int QRPicWidth,int QRHeight,String outputFilePath,String fileName,QRCodePictureTypeEnum qRCodePictureTypeEnum){
if(qRCodePictureTypeEnum == QRCodePictureTypeEnum.GIF){
qRCodeFormat = "gif";
}else if(qRCodePictureTypeEnum == QRCodePictureTypeEnum.JPEG){
qRCodeFormat = "jpeg";
}else if(qRCodePictureTypeEnum == QRCodePictureTypeEnum.JPG){
qRCodeFormat = "jpg";
}else if(qRCodePictureTypeEnum == QRCodePictureTypeEnum.PNG){
qRCodeFormat = "png";
}
try{
//内容所使用字符集编码
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//格式
BitMatrix bitMatrix = new MultiFormatWriter().encode(QRCodeContent, BarcodeFormat.QR_CODE, QRPicWidth, QRHeight, hints);
// 生成二维码
File outputFile = new File(outputFilePath+"\\"+fileName+"."+qRCodeFormat);
MatrixToImageWriter.writeToFile(bitMatrix, qRCodeFormat, outputFile);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* @functionName downLoadQRCodeImage
* @description 客户端下载二维码图片
* @author yzh
* @param response
* @param QRCodeContent 二维码的内容
* @param QRPicWidth 二维码图片宽度
* @param QRHeight 二维码图片高度
* @param qRCodePictureTypeEnum 二维码格式枚举(防止用户手动输入错误的类型)
* @param fileName 文件名
* @param outputFilePath 二维码图片输出路经
* @date 2018-10-15
*/
public void downLoadQRCodeImage(HttpServletResponse response,String QRCodeContent,int QRPicWidth,int QRHeight,String outputFilePath,String fileName,QRCodePictureTypeEnum qRCodePictureTypeEnum){
OutputStream stream = null;
try{
//1、先上传二维码图片
this.uploadQRCodeImage(QRCodeContent, QRPicWidth, QRHeight, outputFilePath, fileName, qRCodePictureTypeEnum);
//2、下载二维码图片
//获取刚才生成的图片,返回二维码图片流:前端通过访问该接口就可以访问这个图片流,从而获取到图片
String newfileName = outputFilePath+"\\"+fileName+"."+qRCodeFormat;
File file = new File(newfileName);
FileInputStream inputStream = new FileInputStream(file);
byte[] data = new byte[(int)file.length()];
inputStream.read(data);
inputStream.close();
//response.setContentType("image/jpg");
//输出流
stream = response.getOutputStream();
//写入图片数据
stream.write(data);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(null != stream){
stream.flush();
stream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(3)测试
@RequestMapping("/downOrderInfoOfQRCode")
public void downOrderInfoOfQRCode(HttpServletResponse response, HttpServletRequest request) throws Exception {
String QRCodeContent = "123457689";
int QRPicWidth = 35;
int QRHeight = 35;
String outputFilePath = "C:\\Users\\Administrator\\Desktop\\test1";
String fileName = "xxx";
QRCodeUtils q = new QRCodeUtils();
//枚举的好处就是枚举.枚举项的类型还是枚举
q.downLoadQRCodeImage(response, QRCodeContent, QRPicWidth, QRHeight, outputFilePath, fileName, QRCodePictureTypeEnum.PNG);
}
在浏览器上输入http://localhost:8080/yx-web/test/yx/downOrderInfoOfQRCode即可看到二维码图片。