#Java--Java生成二维码图片

关于二维码的设计实际上就是利用了上面例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即可看到二维码图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值