1.添加依賴
<groupId>com.google.zxing
? ? <artifactId>core
? ? <version>3.3.0
</dependency>
2.編寫接口
@ApiOperation(value ="獲取最新APP版本二維碼")
@GET
@Path("getAppNewVersionqrcode")
public WebApiResponsedownLoad(@Context HttpServletResponse response)throws IOException {
EupdateInfoDto eupdateInfoDto =eupdateInfoService.getUseVersion();
? ? String filePath ="";
? ? if(null!=eupdateInfoDto){
filePath = eupdateInfoDto.getDownloadUrl();
? ? }else {
filePath ="noResource";
? ? }
//File f =? ResourceUtils.getFile("classpath:static/app_icon.png");//這個方法對項目打包部署不能用
? ? ClassPathResource classPathResource =new ClassPathResource("static/app_icon.png");
? ? InputStream is = classPathResource.getInputStream();
? ? String qrcode = QRCodeUtil.createQrcode(filePath,is,true);
? ? return response(qrcode);
}

3.QRCodeUtil
package com.jpxx.homepage.homePage.web.utils;
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Hashtable;
import java.util.Random;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
//import org.apache.log4j.lf5.util.ResourceUtils;
import sun.misc.BASE64Encoder;
/**
* 提供二維碼生成和解析工具類
* @author Administrator
*
*/
public class QRCodeUtil {
private static final StringCHARSET ="utf-8";
? ? private static final StringFORMAT_NAME ="JPG";
? ? private static final int QRCODE_SIZE =300; // 二維碼尺寸,寬度和高度均是300
? ? private static final int WIDTH =80;? //LOGO寬度
? ? private static final int HEIGHT =80; //LOGO高度
? ? /**
? ? * 生成二維碼的方法
? ? * @param content 目標(biāo)url
? ? * @param imgPath logo圖片地址
? ? * @param needCompress 是否壓縮logo
? ? * @return 二維碼圖片
? ? * @throws Exception
*/
? ? private static BufferedImagecreateImage(String content, InputStream imgPath,boolean needCompress)throws Exception {
Hashtable hints =new Hashtable();
? ? ? ? hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//指定二維碼的糾錯等級為高級
? ? ? ? hints.put(EncodeHintType.CHARACTER_SET, CHARSET);//指定字符編碼為“utf-8”
? ? ? ? hints.put(EncodeHintType.MARGIN, 1); //設(shè)置圖片的邊距
? ? ? ? //參數(shù)1:內(nèi)容,目標(biāo)url,參數(shù)2:固定寫法,參數(shù)3:二維碼的寬度,參數(shù)4:二維碼的高度,參數(shù)5:二維碼屬性設(shè)置
? ? ? ? BitMatrix bitMatrix =new MultiFormatWriter().encode(content,BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
? ? ? ? int width = bitMatrix.getWidth();//二維碼的寬度
? ? ? ? int height = bitMatrix.getHeight();//二維碼的高度
? ? ? ? BufferedImage image =new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);//生成的二維碼image
? ? ? ? for (int x =0; x < width; x++) {
for (int y =0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ?0xFF000000:0xFFFFFFFF);
? ? ? ? ? ? }
}
if (imgPath ==null ||"".equals(imgPath)) {//logo圖片地址為null或空時
? ? ? ? ? ? return image; //只返回二維碼圖片,無中間的logo
? ? ? ? }
// 插入logo圖片? 參數(shù)1:二維碼圖片,參數(shù)2:logo圖片地址,參數(shù)3:壓縮圖片
? ? ? ? QRCodeUtil.insertImage(image, imgPath, needCompress);
? ? ? ? return image;
? ? }
/**
? ? * 插入logo圖片
? ? * @param source 二維碼圖片
? ? * @param imgPath LOGO圖片地址
? ? * @param needCompress 是否壓縮
? ? * @throws Exception
*/
? ? private static void insertImage(BufferedImage source, InputStream imgPath,boolean needCompress)throws Exception {
/*File file = new File(imgPath);//logo圖片地址放入文件if (!file.exists()) {
? ? ? ? ? ? System.err.println("" + imgPath + " 該文件不存在!");
return;
}*/
? ? ? ? Image src = ImageIO.read(imgPath);
? ? ? ? int width = src.getWidth(null);
? ? ? ? int height = src.getHeight(null);
? ? ? ? if (needCompress) {// 壓縮LOGO
? ? ? ? ? ? if (width >WIDTH) {//如果上傳logo寬>60
? ? ? ? ? ? ? ? width =WIDTH;
? ? ? ? ? ? }
if (height >HEIGHT) {//如果上傳logo高>60
? ? ? ? ? ? ? ? height =HEIGHT;
? ? ? ? ? ? }
Image image = src.getScaledInstance(width, height,Image.SCALE_SMOOTH);
? ? ? ? ? ? BufferedImage tag =new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
? ? ? ? ? ? Graphics g = tag.getGraphics();
? ? ? ? ? ? g.drawImage(image, 0, 0, null); // 繪制縮小后的圖
? ? ? ? ? ? g.dispose();
? ? ? ? ? ? src = image;
? ? ? ? }
// 插入LOGO
? ? ? ? Graphics2D graph = source.createGraphics();
? ? ? ? int x = (QRCODE_SIZE - width) /2;
? ? ? ? int y = (QRCODE_SIZE - height) /2;
? ? ? ? graph.drawImage(src, x, y, width, height, null);
? ? ? ? Shape shape =new RoundRectangle2D.Float(x, y, width, width, 6, 6);
? ? ? ? graph.setStroke(new BasicStroke(3f));
? ? ? ? graph.draw(shape);
? ? ? ? graph.dispose();
? ? }
/**
? ? * 生成二維碼(內(nèi)嵌LOGO)
? ? * @param content? 內(nèi)容
? ? * @param imgPath? logo地址
? ? * @param destPath 存放目錄
? ? * @param needCompress 是否壓縮logo
? ? * @throws Exception
*/
? ? public static void encode(String content, InputStream imgPath, String destPath, boolean needCompress)throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, imgPath,needCompress); //生成二維碼
? ? ? ? mkdirs(destPath);
? ? ? ? String file =new Random().nextInt(99999) +".jpg";
? ? ? ? ImageIO.write(image, FORMAT_NAME, new File(destPath +"/" + file));
? ? }
/**
? ? * 當(dāng)文件夾不存在時,mkdirs會自動創(chuàng)建多層目錄,區(qū)別于mkdir.(mkdir如果父目錄不存在則會拋出異常)
? ? * @param destPath 存放目錄
? ? */
? ? public static void mkdirs(String destPath) {
File file =new File(destPath);
? ? ? ? if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
? ? ? ? }
}
/**
? ? * 生成二維碼(內(nèi)嵌LOGO),沒有壓縮
? ? *
? ? * @param content? 內(nèi)容
? ? * @param imgPath? LOGO地址
? ? * @param destPath 存儲地址
? ? * @throws Exception
*/
? ? public static void encode(String content, InputStream imgPath, String destPath)throws Exception {
QRCodeUtil.encode(content, imgPath, destPath, false);
? ? }
/**
? ? * 生成二維碼,無內(nèi)嵌logo
*
? ? * @param content? ? ? 內(nèi)容
? ? * @param destPath? ? 存儲地址
? ? * @param needCompress 是否壓縮LOGO
? ? * @throws Exception
*/
? ? public static void encode(String content, String destPath,boolean needCompress)throws Exception {
QRCodeUtil.encode(content, null, destPath, needCompress);
? ? }
/**
? ? * 生成二維碼
? ? *
? ? * @param content? 內(nèi)容
? ? * @param destPath 存儲地址
? ? * @throws Exception
*/
? ? public static void encode(String content, String destPath)throws Exception {
QRCodeUtil.encode(content, null, destPath, false);
? ? }
/**
? ? * 生成二維碼(內(nèi)嵌LOGO)
*
? ? * @param content? ? ? 內(nèi)容
? ? * @param imgPath? ? ? LOGO地址
? ? * @param output? ? ? 輸出流
? ? * @param needCompress 是否壓縮LOGO
? ? * @throws Exception
*/
? ? public static void encode(String content, InputStream imgPath,OutputStream output, boolean needCompress)throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, imgPath,needCompress);
? ? ? ? ImageIO.write(image, FORMAT_NAME, output);
? ? }
/**
? ? * 生成二維碼
? ? * @param? content 源內(nèi)容
? ? * @return 返回二維碼圖片base64碼
? ? * @throws Exception
*/
? ? public static StringcreateQrcode(String content, InputStream imgPath, boolean flag){
try {
BufferedImage image = QRCodeUtil.createImage(content, imgPath,flag);
? ? ? ? ? ? String qrcode =imageToBase64(image);
? ? ? ? ? ? return qrcode;
? ? ? ? }catch (Exception e) {
e.printStackTrace();
return null;
? ? ? ? }
}
public static StringimageToBase64(BufferedImage image){
ByteArrayOutputStream baos =new ByteArrayOutputStream();//io流
? ? ? ? try {
ImageIO.write(image, "png", baos);//寫入流中
? ? ? ? }catch (IOException e) {
e.printStackTrace();
? ? ? ? }
byte[] bytes = baos.toByteArray();//轉(zhuǎn)換成字節(jié)
? ? ? ? return btyeToBase64(bytes);
? ? }
public static StringbtyeToBase64(byte[] bytes){
String png_base64 =new BASE64Encoder().encodeBuffer(bytes).trim();//轉(zhuǎn)換成base64串
? ? ? ? png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//刪除\r\n
? ? ? ? return "data:image/png;base64,"+png_base64;
? ? }
/**
? ? * 生成二維碼
? ? *
? ? * @param content 內(nèi)容
? ? * @param output? 輸出流
? ? * @throws Exception
*/
? ? public static void encode(String content, OutputStream output)throws Exception {
QRCodeUtil.encode(content, null, output, false);
? ? }
public static void main(String[] args) {
/*String qrcode = createQrcode("http://www.baidu.com","C:\\",true);
System.out.println(qrcode);*/
? ? }
}
4.在resource下新建static文件夾放入icon圖標(biāo),打jar包,運(yùn)行即可