java中使用zxing批量生成二維碼立牌
使用zxing批量在做好的立牌背景圖的指定位置上,把指定的文本內(nèi)容(鏈接地址、文本等)生成二維碼并放在該位置,最后加上立牌編號。
步驟:
1).做好背景圖,如下圖:
2).生成二維碼BufferedImage對象。代碼如下:
/** * * @Title: toBufferedImage * @Description: 把文本轉(zhuǎn)化成二維碼圖片對象 * @param text * 二維碼內(nèi)容 * @param width * 二維碼高度 * @param height * 二位寬度 * @param * @param Exception * 設定文件 * @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 * 目標圖 * @param positionWidth * 位置橫坐標 * @param positionHeight * 位置縱坐標 * @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、設置對線段的鋸齒狀邊緣處理 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 * 目標圖片 * @param x * 橫坐標 * @param y * 縱坐標 * @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); // 設置顏色 g.setColor(new Color(89, 87, 87)); // 設置 Font g.setFont(new Font("方正蘭亭中黑_GBK", Font.BOLD, 14)); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 第一參數(shù)->設置的內(nèi)容,后面兩個參數(shù)->文字在圖片上的坐標位置(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 * 設定文件 * @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 * 目標圖 * @param positionWidth * 位置橫坐標 * @param positionHeight * 位置縱坐標 * @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、設置對線段的鋸齒狀邊緣處理 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 * 目標圖片 * @param x * 橫坐標 * @param y * 縱坐標 * @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); // 設置顏色 g.setColor(new Color(89, 87, 87)); // 設置 Font g.setFont(new Font("方正蘭亭中黑_GBK", Font.BOLD, 14)); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 第一參數(shù)->設置的內(nèi)容,后面兩個參數(shù)->文字在圖片上的坐標位置(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,默認格式為yyyy-MM-dd HH:mm:ss,默認日期為當前日期. */ public static String toStr() { return toStr(DF_DATETIME); } /** 將日期格式化為String,格式由參數(shù)format指定,默認日期為當前日期,format值可使用本類常量或自定義. */ public static String toStr(String format) { return toStr(format, new Date()); } /** 將日期格式化為String,默認格式為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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot項目啟動的時候,運行main方法報錯NoClassDefFoundError問題
這篇文章主要介紹了springboot項目啟動的時候,運行main方法報錯NoClassDefFoundError問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Spring5中SpringWebContext方法過時的解決方案
這篇文章主要介紹了Spring5中SpringWebContext方法過時的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01springboot設置了server.port但是沒有用,還是8080問題
這篇文章主要介紹了springboot設置了server.port但是沒有用,還是8080問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12超詳細講解SpringCloud?Commons公共抽象的用法
這篇文章主要介紹了超詳細講解SpringCloud?Commons公共抽象的用法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04