JAVA Qrcode實現帶有logo的二維碼(源碼)
閒來無事,搞個二維碼玩玩(生成的二維碼不讓往頭條裡放)
用的是Qrcode_swetake.jar包(可以從網上下載,也可以私信我)
源碼(直接拷走,導入jar就可以了,感興趣的可以試試):
package an.common;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode;
public class QrcodeUtil {
public static void main(String[] args) throws IOException {
//調用生成二維碼的方法
getorcodeImg("https://www.toutiao.com/c/user/16038770057/#mid=1571462165285889","D:/qrcode.png","G:/qrlogo.png");
}
/**
* 製作二維碼(喜歡的話右上角關注)
* @param content 掃描二維碼將要跳轉的地址
* @param imgPath 生產二位碼的地址和名稱
* @param logoPath 二維碼中間的那個圖片地址
* @throws IOException
*/
public static void getorcodeImg(String content,String imgPath,String logoPath) throws IOException {
Qrcode qr = new Qrcode();
//vs是版本號
int vs =20;
//API文檔規定計算二維碼圖片寬高的方式
int width = 67 + 12 * (vs - 1);
int height = 67 + 12 * (vs - 1);
/**
* 糾錯等級分為
* level L : 最大 7% 的錯誤能夠被糾正;
* level M : 最大 15% 的錯誤能夠被糾正;
* level Q : 最大 25% 的錯誤能夠被糾正;
* level H : 最大 30% 的錯誤能夠被糾正;
*/
qr.setQrcodeErrorCorrect('L');
//設置編碼格式
qr.setQrcodeEncodeMode('B');
//設置版本號 1-40
qr.setQrcodeVersion(vs);
//漢字轉格式需要拋出異常
byte[] con = content.getBytes("utf-8");
//緩衝區(面板)
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
//繪圖(畫筆)
Graphics2D gs = bufferedImage.createGraphics();
//設置背景色
gs.setBackground(Color.WHITE);
//設置繪製內容的顏色
gs.setColor(Color.BLACK);
//設置二維碼繪製區域
gs.clearRect(0, 0, width, height);
//是否會引起字符串長度大於120導致生成代碼不執行,二維碼空白
if (con.length > 0 && con.length < 120) {
boolean[][] qrc = qr.calQrcode(con);
for (int i = 0; i < qrc.length; i++) {
for (int j = 0; j < qrc.length; j++) {
if (qrc[j][i]) {
gs.fillRect(j*3+2, i*3+2, 3, 3);
}
}
}
}
//添加水印圖片(logo)
File logoFile=new File(logoPath);
Image srcimage=ImageIO.read(logoFile);
//logo的寬高
int lgWidth=srcimage.getWidth(null);
int lgHeight=srcimage.getHeight(null);
gs.drawImage(srcimage, (width-lgWidth)/2, (height-lgHeight)/2, lgWidth, lgHeight,null);
gs.dispose();
bufferedImage.flush();
//設置圖片格式,與輸出的路徑
ImageIO.write(bufferedImage, "png", new File(imgPath));
System.out.println("二維碼完成");
}
}
新手上路多多關注,持續更新。
分享一些工作中遇到的問題都會記錄下來,和一些好的資源都會分享給大家。
希望多多支持小編。
閒來無事,搞個二維碼玩玩(生成的二維碼不讓往頭條裡放)
用的是Qrcode_swetake.jar包(可以從網上下載,也可以私信我)
源碼(直接拷走,導入jar就可以了,感興趣的可以試試):
package an.common;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode;
public class QrcodeUtil {
public static void main(String[] args) throws IOException {
//調用生成二維碼的方法
getorcodeImg("https://www.toutiao.com/c/user/16038770057/#mid=1571462165285889","D:/qrcode.png","G:/qrlogo.png");
}
/**
* 製作二維碼(喜歡的話右上角關注)
* @param content 掃描二維碼將要跳轉的地址
* @param imgPath 生產二位碼的地址和名稱
* @param logoPath 二維碼中間的那個圖片地址
* @throws IOException
*/
public static void getorcodeImg(String content,String imgPath,String logoPath) throws IOException {
Qrcode qr = new Qrcode();
//vs是版本號
int vs =20;
//API文檔規定計算二維碼圖片寬高的方式
int width = 67 + 12 * (vs - 1);
int height = 67 + 12 * (vs - 1);
/**
* 糾錯等級分為
* level L : 最大 7% 的錯誤能夠被糾正;
* level M : 最大 15% 的錯誤能夠被糾正;
* level Q : 最大 25% 的錯誤能夠被糾正;
* level H : 最大 30% 的錯誤能夠被糾正;
*/
qr.setQrcodeErrorCorrect('L');
//設置編碼格式
qr.setQrcodeEncodeMode('B');
//設置版本號 1-40
qr.setQrcodeVersion(vs);
//漢字轉格式需要拋出異常
byte[] con = content.getBytes("utf-8");
//緩衝區(面板)
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
//繪圖(畫筆)
Graphics2D gs = bufferedImage.createGraphics();
//設置背景色
gs.setBackground(Color.WHITE);
//設置繪製內容的顏色
gs.setColor(Color.BLACK);
//設置二維碼繪製區域
gs.clearRect(0, 0, width, height);
//是否會引起字符串長度大於120導致生成代碼不執行,二維碼空白
if (con.length > 0 && con.length < 120) {
boolean[][] qrc = qr.calQrcode(con);
for (int i = 0; i < qrc.length; i++) {
for (int j = 0; j < qrc.length; j++) {
if (qrc[j][i]) {
gs.fillRect(j*3+2, i*3+2, 3, 3);
}
}
}
}
//添加水印圖片(logo)
File logoFile=new File(logoPath);
Image srcimage=ImageIO.read(logoFile);
//logo的寬高
int lgWidth=srcimage.getWidth(null);
int lgHeight=srcimage.getHeight(null);
gs.drawImage(srcimage, (width-lgWidth)/2, (height-lgHeight)/2, lgWidth, lgHeight,null);
gs.dispose();
bufferedImage.flush();
//設置圖片格式,與輸出的路徑
ImageIO.write(bufferedImage, "png", new File(imgPath));
System.out.println("二維碼完成");
}
}