Java生成二維碼

第一步

導入依賴包

com.google.zxing

core

3.1.0

com.google.zxing

javase

3.1.0

第二步,創建class文件(QRCodeUtils )

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.File;

import java.io.OutputStream;

import java.util.Hashtable;

import java.util.Random;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;

import com.google.zxing.BinaryBitmap;

import com.google.zxing.DecodeHintType;

import com.google.zxing.EncodeHintType;

import com.google.zxing.MultiFormatReader;

import com.google.zxing.MultiFormatWriter;

import com.google.zxing.Result;

import com.google.zxing.client.j2se.BufferedImageLuminanceSource;

import com.google.zxing.common.BitMatrix;

import com.google.zxing.common.HybridBinarizer;

import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class QRCodeUtils {

private static final String CHARSET = "utf-8";

private static final String FORMAT_NAME = "JPG";

// 二維碼尺寸

private static final int QRCODE_SIZE = 300;

// LOGO寬度

private static final int WIDTH = 60;

// LOGO高度

private static final int HEIGHT = 60;

private static BufferedImage createImage(String content, String imgPath,

boolean needCompress) throws Exception {

Hashtable hints = new Hashtable();

hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

hints.put(EncodeHintType.CHARACTER_SET, CHARSET);

hints.put(EncodeHintType.MARGIN, 1);

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);

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)) {

return image;

}

// 插入圖片

QRCodeUtils.insertImage(image, imgPath, needCompress);

return image;

}

/**

  • 插入LOGO

  • @param source

  • 二維碼圖片

  • @param imgPath

  • LOGO圖片地址

  • @param needCompress

  • 是否壓縮

  • @throws Exception

*/

private static void insertImage(BufferedImage source, String imgPath,

boolean needCompress) throws Exception {

File file = new File(imgPath);

if (!file.exists()) {

System.err.println(""+imgPath+" 該文件不存在!");

return;

}

Image src = ImageIO.read(new File(imgPath));

int width = src.getWidth(null);

int height = src.getHeight(null);

if (needCompress) { // 壓縮LOGO

if (width > WIDTH) {

width = WIDTH;

}

if (height > HEIGHT) {

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();

}

/**

  • 生成二維碼(內嵌LOGO)

  • @param content

  • 內容

  • @param imgPath

  • LOGO地址

  • @param destPath

  • 存放目錄

  • @param needCompress

  • 是否壓縮LOGO

  • @throws Exception

*/

public static String encode(String content, String imgPath, String destPath,

boolean needCompress) throws Exception {

BufferedImage image = QRCodeUtils.createImage(content, imgPath,

needCompress);

mkdirs(destPath);

String file = new Random().nextInt(99999999)+".jpg";

ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));

return file;

}

/**

  • 當文件夾不存在時,mkdirs會自動創建多層目錄,區別於mkdir.(mkdir如果父目錄不存在則會拋出異常)MT4部分平倉

  • @date 2013-12-11 上午10:16:36

  • @param destPath 存放目錄

*/

public static void mkdirs(String destPath) {

File file =new File(destPath);

//當文件夾不存在時,mkdirs會自動創建多層目錄,區別於mkdir.(mkdir如果父目錄不存在則會拋出異常)

if (!file.exists() && !file.isDirectory()) {

file.mkdirs();

}

}

/**

  • 生成二維碼(內嵌LOGO)

  • @param content

  • 內容

  • @param imgPath

  • LOGO地址

  • @param destPath

  • 存儲地址

  • @throws Exception

*/

public static void encode(String content, String imgPath, String destPath)

throws Exception {

QRCodeUtils.encode(content, imgPath, destPath, false);

}

/**

  • 生成二維碼

  • @param content

  • 內容

  • @param destPath

  • 存儲地址

  • @param needCompress

  • 是否壓縮LOGO

  • @throws Exception

*/

public static void encode(String content, String destPath,

boolean needCompress) throws Exception {

QRCodeUtils.encode(content, null, destPath, needCompress);

}

/**

  • 生成二維碼

  • @param content

  • 內容

  • @param destPath

  • 存儲地址

  • @throws Exception

*/

public static void encode(String content, String destPath) throws Exception {

QRCodeUtils.encode(content, null, destPath, false);

}

/**

  • 生成二維碼(內嵌LOGO)

  • @param content

  • 內容

  • @param imgPath

  • LOGO地址

  • @param output

  • 輸出流

  • @param needCompress

  • 是否壓縮LOGO

  • @throws Exception

*/

public static void encode(String content, String imgPath,

OutputStream output, boolean needCompress) throws Exception {

BufferedImage image = QRCodeUtils.createImage(content, imgPath,

needCompress);

ImageIO.write(image, FORMAT_NAME, output);

}

/**

  • 生成二維碼

  • @param content

  • 內容

  • @param output

  • 輸出流

  • @throws Exception

*/

public static void encode(String content, OutputStream output)

throws Exception {

QRCodeUtils.encode(content, null, output, false);

}

/**

  • 解析二維碼

  • @param file

  • 二維碼圖片

  • @return

  • @throws Exception

*/

public static String decode(File file) throws Exception {

BufferedImage image;

image = ImageIO.read(file);

if (image == null) {

return null;

}

BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(

image);

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

Result result;

Hashtable hints = new Hashtable();

hints.put(DecodeHintType.CHARACTER_SET, CHARSET);

result = new MultiFormatReader().decode(bitmap, hints);

String resultStr = result.getText();

return resultStr;

}

/**

  • 解析二維碼

  • @param path

  • 二維碼圖片地址

  • @return

  • @throws Exception

*/

public static String decode(String path) throws Exception {

return QRCodeUtils.decode(new File(path));

}

}

第三步,Controller層

@AuthIgnore

@GetMapping("QRCode")

public R QRCode() {

String text = "I love you"; //生成二維碼的內容

String logoPath = "D:\img\1575892281966maxresdefault.jpg"; //二維碼的logo圖片

String destPath = "D:\img"; //生成的二維碼存儲本地的地址

try {

System.out.println(QRCodeUtils.encode(text, logoPath, destPath, true));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return R.ok().put("msg", "成功");

}

第四步 使用Postman訪問接口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章