接口生成二維碼

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)行即可

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容