java中使用zxing批量生成二維碼立牌
使用zxing批量在做好的立牌背景圖的指定位置上,把指定的文本內(nèi)容(鏈接地址、文本等)生成二維碼并放在該位置,最后加上立牌編號。
步驟:
1).做好背景圖,如下圖:

2).生成二維碼BufferedImage對象。代碼如下:
/**
*
* @Title: toBufferedImage
* @Description: 把文本轉(zhuǎn)化成二維碼圖片對象
* @param text
* 二維碼內(nèi)容
* @param width
* 二維碼高度
* @param height
* 二位寬度
* @param
* @param Exception
* 設(shè)定文件
* @return BufferedImage 返回類型
* @throws
*/
public static BufferedImage toBufferedImage(String text, int width,
int height) throws Exception {
int BLACK = 0xFF000000;
int WHITE = 0xFFFFFFFF;
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 內(nèi)容所使用字符集編碼
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix matrix = new MultiFormatWriter().encode(text,
BarcodeFormat.QR_CODE, width, height, hints);
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) ? BLACK : WHITE);
}
}
return image;
}
3).在立牌背景圖的指定位置上生成二維碼,代碼如下:
/**
*
* @Title: markImageByCode
* @Description: 向圖片指定位置增加二維碼
* @param img
* 二維碼image對象
* @param srcImgPath
* 背景圖
* @param targerPath
* 目標(biāo)圖
* @param positionWidth
* 位置橫坐標(biāo)
* @param positionHeight
* 位置縱坐標(biāo)
* @return void 返回類型
* @throws
*/
public static void markImageByCode(Image img, String srcImgPath,
String targerPath, int positionWidth, int positionHeight) {
OutputStream os = null;
try {
Image srcImg = ImageIO.read(new File(srcImgPath));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
// 1、得到畫筆對象
Graphics2D g = buffImg.createGraphics();
// 2、設(shè)置對線段的鋸齒狀邊緣處理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null),
srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 3、二維碼位置
g.drawImage(img, positionWidth, positionHeight, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
// 4、釋放資源
g.dispose();
// 5、生成圖片(建議生成PNG的,jpg會失真)
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "PNG", os);
System.out.println("二維碼圖片生成成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
4).在立牌上加上立牌編號
/**
*
* @Title: pressText
* @Description:向圖片指定位置加上文字
* @param pressText
* 文字內(nèi)容
* @param srcImageFile
* 原圖片
* @param destImageFile
* 目標(biāo)圖片
* @param x
* 橫坐標(biāo)
* @param y
* 縱坐標(biāo)
* @param alpha
* 透明度
* @return void 返回類型
* @throws
*/
public final static void pressText(String pressText, String srcImageFile,
String destImageFile, int x, int y, float alpha) {
try {
File img = new File(srcImageFile);
Image src = ImageIO.read(img);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 開文字抗鋸齒 去文字毛刺
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.drawImage(src, 0, 0, width, height, null);
// 設(shè)置顏色
g.setColor(new Color(89, 87, 87));
// 設(shè)置 Font
g.setFont(new Font("方正蘭亭中黑_GBK", Font.BOLD, 14));
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 第一參數(shù)->設(shè)置的內(nèi)容,后面兩個參數(shù)->文字在圖片上的坐標(biāo)位置(x,y) .
g.drawString(pressText, x, y);
g.dispose();
ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 輸出到文件流
} catch (Exception e) {
e.printStackTrace();
}
}
示例:
代碼:
測試代碼
public class codeTest {
public static void main(String[] args) throws Exception {
String text = "http://www.xxx.com/"; // 二維碼內(nèi)容
// 生成二維碼
//生成圖片二維碼存放目錄
String targetPath = "f:/qrcode/targetimg/" + Utils.toStr();
//創(chuàng)建目錄
Utils.makeDirs(targetPath);
int begin = 100;//code 開始數(shù)字
int end = 101;//code結(jié)束數(shù)字
for (int i = begin; i <= end; i++) {
//生成含日期的16位數(shù)字如20161214000001
String code = Utils.toStr() + Utils.formateNumber(i);
//獲取二維碼對象
BufferedImage image = Utils.toBufferedImage(text
+ "?payCode=" + code,240,240);
//生成含背景圖+二維碼的立牌的圖
Utils.markImageByCode(image, "f:/qrcode/srcimg/src.png",
targetPath + "/" + code + ".png", 340, 160);
//立牌的圖加上code編號
Utils.pressText(code, targetPath + "/" + code + ".png", targetPath
+ "/" + code + ".png", 390, 417, 0.5f);
}
// 生成二維碼
}
}
效果:
批量生成的圖片效果圖如下

批量圖:

utils代碼:
package cn.utils.code;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
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;
/** 工具類. */
public abstract class Utils {
/** 日期格式:yyyy-MM-dd HH:mm:ss */
public static String DF_DATETIME = "yyyyMMdd";
private static float alpha = 1f;
/**
*
* @Title: toBufferedImage
* @Description: 把文本轉(zhuǎn)化成二維碼圖片對象
* @param text
* 二維碼內(nèi)容
* @param width
* 二維碼高度
* @param height
* 二位寬度
* @param
* @param Exception
* 設(shè)定文件
* @return BufferedImage 返回類型
* @throws
*/
public static BufferedImage toBufferedImage(String text, int width,
int height) throws Exception {
int BLACK = 0xFF000000;
int WHITE = 0xFFFFFFFF;
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 內(nèi)容所使用字符集編碼
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix matrix = new MultiFormatWriter().encode(text,
BarcodeFormat.QR_CODE, width, height, hints);
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) ? BLACK : WHITE);
}
}
return image;
}
/**
*
* @Title: markImageByCode
* @Description: 向圖片指定位置增加二維碼
* @param img
* 二維碼image對象
* @param srcImgPath
* 背景圖
* @param targerPath
* 目標(biāo)圖
* @param positionWidth
* 位置橫坐標(biāo)
* @param positionHeight
* 位置縱坐標(biāo)
* @return void 返回類型
* @throws
*/
public static void markImageByCode(Image img, String srcImgPath,
String targerPath, int positionWidth, int positionHeight) {
OutputStream os = null;
try {
Image srcImg = ImageIO.read(new File(srcImgPath));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
// 1、得到畫筆對象
Graphics2D g = buffImg.createGraphics();
// 2、設(shè)置對線段的鋸齒狀邊緣處理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null),
srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 3、二維碼位置
g.drawImage(img, positionWidth, positionHeight, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
// 4、釋放資源
g.dispose();
// 5、生成圖片(建議生成PNG的,jpg會失真)
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "PNG", os);
System.out.println("二維碼圖片生成成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
* @Title: pressText
* @Description:向圖片指定位置加上文字
* @param pressText
* 文字內(nèi)容
* @param srcImageFile
* 原圖片
* @param destImageFile
* 目標(biāo)圖片
* @param x
* 橫坐標(biāo)
* @param y
* 縱坐標(biāo)
* @param alpha
* 透明度
* @return void 返回類型
* @throws
*/
public final static void pressText(String pressText, String srcImageFile,
String destImageFile, int x, int y, float alpha) {
try {
File img = new File(srcImageFile);
Image src = ImageIO.read(img);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 開文字抗鋸齒 去文字毛刺
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.drawImage(src, 0, 0, width, height, null);
// 設(shè)置顏色
g.setColor(new Color(89, 87, 87));
// 設(shè)置 Font
g.setFont(new Font("方正蘭亭中黑_GBK", Font.BOLD, 14));
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 第一參數(shù)->設(shè)置的內(nèi)容,后面兩個參數(shù)->文字在圖片上的坐標(biāo)位置(x,y) .
g.drawString(pressText, x, y);
g.dispose();
ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 輸出到文件流
} catch (Exception e) {
e.printStackTrace();
}
}
// 日期轉(zhuǎn)字符串
/** 將日期格式化為String,默認(rèn)格式為yyyy-MM-dd HH:mm:ss,默認(rèn)日期為當(dāng)前日期. */
public static String toStr() {
return toStr(DF_DATETIME);
}
/** 將日期格式化為String,格式由參數(shù)format指定,默認(rèn)日期為當(dāng)前日期,format值可使用本類常量或自定義. */
public static String toStr(String format) {
return toStr(format, new Date());
}
/** 將日期格式化為String,默認(rèn)格式為yyyy-MM-dd HH:mm:ss,日期由參數(shù)date指定. */
public static String toStr(Date date) {
return toStr(DF_DATETIME, date);
}
/** 將日期格式化為String,格式由參數(shù)format指定,日期由參數(shù)date指定,format值可使用本類常量或自定義. */
public static String toStr(String format, Date date) {
return new SimpleDateFormat(format).format(date);
}
public static String formateNumber(int num) {
DecimalFormat df = new DecimalFormat("000000");
String str2 = df.format(num);
return str2;
}
public static boolean makeDirs(String filePath) {
File folder = new File(filePath);
return (folder.exists() && folder.isDirectory()) ? true : folder
.mkdirs();
}
}
使用的技術(shù):
1.使用的zxing生成二維碼工具。
1)下載地址:http://repo1.maven.org/maven2/com/google/zxing/javase/3.1.0/
2).maven配置
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>2.2</version> </dependency>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot項目啟動的時候,運(yùn)行main方法報錯NoClassDefFoundError問題
這篇文章主要介紹了springboot項目啟動的時候,運(yùn)行main方法報錯NoClassDefFoundError問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring5中SpringWebContext方法過時的解決方案
這篇文章主要介紹了Spring5中SpringWebContext方法過時的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
springboot設(shè)置了server.port但是沒有用,還是8080問題
這篇文章主要介紹了springboot設(shè)置了server.port但是沒有用,還是8080問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
超詳細(xì)講解SpringCloud?Commons公共抽象的用法
這篇文章主要介紹了超詳細(xì)講解SpringCloud?Commons公共抽象的用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

