本篇內容主要講解“java怎么生成qrCode”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java怎么生成qrCode”吧!
參數類:
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
/**
*
*/
public class QRCodeParams {
private String txt; // 二維碼內容
private String qrCodeUrl; // 二維碼網絡路徑
private String logoPath; // logo圖片
private Integer width = 300; // 二維碼寬度
private Integer height = 300; // 二維碼高度
private Integer onColor = 0xFF000000; // 前景色
private Integer offColor = 0xFFFFFFFF; // 背景色
private Integer margin = 1; // 白邊大小,取值范圍0~4
private ErrorCorrectionLevel level = ErrorCorrectionLevel.L; // 二維碼容錯率
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
public String getQrCodeUrl() {
return qrCodeUrl;
}
public void setQrCodeUrl(String qrCodeUrl) {
this.qrCodeUrl = qrCodeUrl;
}
public String getLogoPath() {
return logoPath;
}
public void setLogoPath(String logoPath) {
this.logoPath = logoPath;
}
public Integer getOnColor() {
return onColor;
}
public void setOnColor(Integer onColor) {
this.onColor = onColor;
}
public Integer getOffColor() {
return offColor;
}
public void setOffColor(Integer offColor) {
this.offColor = offColor;
}
public ErrorCorrectionLevel getLevel() {
return level;
}
public void setLevel(ErrorCorrectionLevel level) {
this.level = level;
}
public Integer getMargin() {
return margin;
}
public void setMargin(Integer margin) {
this.margin = margin;
}
}圖標配置類:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import javax.imageio.ImageIO;
/**
*/
public class QRLogoConfig {
/**
* 設置 logo
*
* @param matrixImage
* 源二維碼圖片
* @return 返回帶有logo的二維碼圖片
* @throws IOException
* @author Administrator sangwenhao
*/
public BufferedImage LogoMatrix(BufferedImage matrixImage, String logoPath)
throws IOException {
/**
* 讀取二維碼圖片,并構建繪圖對象
*/
Graphics2D g2 = matrixImage.createGraphics();
int matrixWidth = matrixImage.getWidth();
int matrixHeigh = matrixImage.getHeight();
int num = logoPath.indexOf('/', 8);
String u = logoPath.substring(0, num);
URL url = new URL(logoPath);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("referer", u);
/**
* 讀取Logo圖片
*/
BufferedImage logo = ImageIO.read(connection.getInputStream());
// 開始繪制圖片
g2.drawImage(logo, matrixWidth / 5 * 2, matrixHeigh / 5 * 2,
matrixWidth / 5, matrixHeigh / 5, null);// 繪制
BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND);
g2.setStroke(stroke);// 設置筆畫對象
// 指定弧度的圓角矩形
RoundRectangle2D.Float round = new RoundRectangle2D.Float(
matrixWidth / 5 * 2, matrixHeigh / 5 * 2, matrixWidth / 5,
matrixHeigh / 5, 20, 20);
g2.setColor(Color.white);
g2.draw(round);// 繪制圓弧矩形
// 設置logo 有一道灰色邊框
BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND);
g2.setStroke(stroke2);// 設置筆畫對象
RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(
matrixWidth / 5 * 2 + 2, matrixHeigh / 5 * 2 + 2,
matrixWidth / 5 - 4, matrixHeigh / 5 - 4, 20, 20);
g2.setColor(new Color(128, 128, 128));
g2.draw(round2);// 繪制圓弧矩形
g2.dispose();
matrixImage.flush();
return matrixImage;
}
}異常類:
/**
*
*/
public class QRParamsException extends Exception {
private static final long serialVersionUID = 8837582301762730656L;
public QRParamsException() {
} // 用來創建無參數對象
public QRParamsException(String message) { // 用來創建指定參數對象
super(message); // 調用超類構造器
}
}工具處理類:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import org.apache.commons.lang3.StringUtils;
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;
/**
*
*/
public class QRCodeUtil {
private static int width = 500; // 二維碼寬度
private static int height = 500; // 二維碼高度
private static int onColor = 0xFF000000; // 前景色
private static int offColor = 0xFFFFFFFF; // 背景色
private static int margin = 1; // 白邊大小,取值范圍0~4
private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L; // 二維碼容錯率
/**
* 生成二維碼
*
* @param params
* QRCodeParams屬性:txt、fileName、filePath不得為空;
* @throws QRParamsException
*/
public static ByteArrayOutputStream generateQRImage(QRCodeParams params)
throws QRParamsException {
if (params == null || params.getTxt() == null) {
throw new QRParamsException("參數錯誤");
}
try {
initData(params);
String txt = params.getTxt();
if (StringUtils.isNoneBlank(params.getLogoPath())) {
return generateQRImage(txt, params.getLogoPath());
} else {
return generateQRImage(txt);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 生成二維碼
*
* @param txt
* //二維碼內容
*/
public static ByteArrayOutputStream generateQRImage(String txt) {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
// 指定糾錯等級
hints.put(EncodeHintType.ERROR_CORRECTION, level);
// 指定編碼格式
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, margin);
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,
BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage image = toBufferedImage(bitMatrix);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(image, "PNG", out);
return out;
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 生成帶logo的二維碼圖片
*
* @param txt
* //二維碼內容
* @param logoPath
* //logo絕對物理路徑
* @throws Exception
*/
public static ByteArrayOutputStream generateQRImage(String txt,
String logoPath) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
// 指定糾錯等級,糾錯級別(L 7%、M 15%、Q 25%、H 30%)
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, level);
hints.put(EncodeHintType.MARGIN, margin);
BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,
BarcodeFormat.QR_CODE, width, height, hints);
return writeToFile(bitMatrix, logoPath);
}
/**
*
* @param matrix
* 二維碼矩陣相關
* @param format
* 二維碼圖片格式
* @param file
* 二維碼圖片文件
* @param logoPath
* logo路徑
* @throws IOException
*/
public static void writeToFile(BitMatrix matrix, String format, File file,
String logoPath) throws IOException {
BufferedImage image = toBufferedImage(matrix);
Graphics2D gs = image.createGraphics();
int ratioWidth = image.getWidth() * 2 / 10;
int ratioHeight = image.getHeight() * 2 / 10;
// 載入logo
Image img = ImageIO.read(new File(logoPath));
int logoWidth = img.getWidth(null) > ratioWidth ? ratioWidth : img
.getWidth(null);
int logoHeight = img.getHeight(null) > ratioHeight ? ratioHeight : img
.getHeight(null);
int x = (image.getWidth() - logoWidth) / 2;
int y = (image.getHeight() - logoHeight) / 2;
gs.drawImage(img, x, y, logoWidth, logoHeight, null);
gs.setColor(Color.black);
gs.setBackground(Color.WHITE);
gs.dispose();
img.flush();
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format "
+ format + " to " + file);
}
}
public static ByteArrayOutputStream writeToFile(BitMatrix matrix,
String logoPath) throws IOException {
BufferedImage image = toBufferedImage(matrix);
// 設置logo圖標
QRLogoConfig logoConfig = new QRLogoConfig();
image = logoConfig.LogoMatrix(image, logoPath);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(image, "PNG", out);
return out;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
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) ? onColor : offColor);
}
}
return image;
}
public static BitMatrix deleteWhite(BitMatrix matrix) {
int[] rec = matrix.getEnclosingRectangle();
int resWidth = rec[2] + 1;
int resHeight = rec[3] + 1;
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
resMatrix.clear();
for (int i = 0; i < resWidth; i++) {
for (int j = 0; j < resHeight; j++) {
if (matrix.get(i + rec[0], j + rec[1]))
resMatrix.set(i, j);
}
}
return resMatrix;
}
private static void initData(QRCodeParams params) {
if (params.getWidth() != null) {
width = params.getWidth();
}
if (params.getHeight() != null) {
height = params.getHeight();
}
if (params.getOnColor() != null) {
onColor = params.getOnColor();
}
if (params.getOffColor() != null) {
offColor = params.getOffColor();
}
if (params.getLevel() != null) {
level = params.getLevel();
}
}
}調用:
QRCodeParams qrParams = new QRCodeParams(); // url = "http://192.168.1.2:8086/business"; qrParams.setTxt(url); qrParams.setWidth(300); qrParams.setHeight(300); ByteArrayOutputStream out = QRCodeUtil.generateQRImage(qrParams); qrCode = this.uploadService.upload(out,IdUtils.id()+".png");
到此,相信大家對“java怎么生成qrCode”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。