国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java中使用zxing批量生成二維碼立牌

2019-11-26 13:26:49
字體:
來源:轉載
供稿:網友

使用zxing批量在做好的立牌背景圖的指定位置上,把指定的文本內容(鏈接地址、文本等)生成二維碼并放在該位置,最后加上立牌編號。

步驟:

1).做好背景圖,如下圖:

2).生成二維碼BufferedImage對象。代碼如下:

/**   *   * @Title: toBufferedImage   * @Description: 把文本轉化成二維碼圖片對象   * @param text   *   二維碼內容   * @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"); // 內容所使用字符集編碼   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   *   文字內容   * @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));    // 第一參數->設置的內容,后面兩個參數->文字在圖片上的坐標位置(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/"; // 二維碼內容    // 生成二維碼   //生成圖片二維碼存放目錄   String targetPath = "f:/qrcode/targetimg/" + Utils.toStr();   //創建目錄   Utils.makeDirs(targetPath);      int begin = 100;//code 開始數字   int end = 101;//code結束數字   for (int i = begin; i <= end; i++) {    //生成含日期的16位數字如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: 把文本轉化成二維碼圖片對象   * @param text   *   二維碼內容   * @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"); // 內容所使用字符集編碼   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   *   文字內容   * @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));    // 第一參數->設置的內容,后面兩個參數->文字在圖片上的坐標位置(x,y) .    g.drawString(pressText, x, y);    g.dispose();    ImageIO.write((BufferedImage) image, "PNG", new File(destImageFile));// 輸出到文件流   } catch (Exception e) {    e.printStackTrace();   }  }   // 日期轉字符串   /** 將日期格式化為String,默認格式為yyyy-MM-dd HH:mm:ss,默認日期為當前日期. */  public static String toStr() {   return toStr(DF_DATETIME);  }   /** 將日期格式化為String,格式由參數format指定,默認日期為當前日期,format值可使用本類常量或自定義. */  public static String toStr(String format) {   return toStr(format, new Date());  }   /** 將日期格式化為String,默認格式為yyyy-MM-dd HH:mm:ss,日期由參數date指定. */  public static String toStr(Date date) {   return toStr(DF_DATETIME, date);  }   /** 將日期格式化為String,格式由參數format指定,日期由參數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();  }  } 

使用的技術:

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> 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐都县| 锦屏县| 韶山市| 宁阳县| 连城县| 留坝县| 新昌县| 太和县| 井陉县| 女性| 德惠市| 湘乡市| 麻阳| 阳原县| 山阴县| 天津市| 嘉祥县| 宣武区| 阳新县| 许昌县| 鄄城县| 濮阳县| 阳信县| 分宜县| 大竹县| 桦川县| 尉犁县| 百色市| 东城区| 拜城县| 辽中县| 五大连池市| 竹山县| 永登县| 阿克陶县| 屏山县| 盖州市| 嘉禾县| 交城县| 潜山县| 武穴市|