java中使用zxing批量生成二维码立牌

发布时间 - 2026-01-10 21:50:10    点击率:

使用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> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # zxing生成二维码  # java批量生成二维码  # Java利用Zxing生成二维码的简单实例  # java ZXing生成二维码及条码实例分享  # java中ZXing 生成、解析二维码图片的小示例  # Java中基于maven实现zxing二维码功能  # Java使用Google Zxing生成二维码的例子  # 基于google zxing的Java二维码生成与解码  # Java基于zxing生成二维码矩阵过程解析  # java zxing合成复杂二维码图片示例详解  # Java使用Zxing二维码生成的简单示例  # Java基于Google zxing生成带logo的二维码图片  # 本类  # 自定义  # 二位  # 转化成  # 格式为  # 边缘  # 亭中  # 放在  # 抗锯齿  # 下载地址  # 大家多多  # 如下图  # createGraphics  # positionWidth  # Graphics2D  # setRenderingHint  # getHeight  # srcImgPath  # KEY_INTERPOLATION  # targerPath 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 无锡营销型网站制作公司,无锡网选车牌流程?  如何用AWS免费套餐快速搭建高效网站?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何快速辨别茅台真假?关键步骤解析  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  七夕网站制作视频,七夕大促活动怎么报名?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何创建自定义Artisan命令?(代码示例)  三星、SK海力士获美批准:可向中国出口芯片制造设备  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Android滚轮选择时间控件使用详解  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  javascript基于原型链的继承及call和apply函数用法分析  浅述节点的创建及常见功能的实现  Laravel如何使用Telescope进行调试?(安装和使用教程)  Python文件流缓冲机制_IO性能解析【教程】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  如何在云主机快速搭建网站站点?  如何选择PHP开源工具快速搭建网站?  Java类加载基本过程详细介绍  如何用IIS7快速搭建并优化网站站点?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何快速搭建虚拟主机网站?新手必看指南  如何在腾讯云服务器上快速搭建个人网站?  JavaScript常见的五种数组去重的方式  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  微信小程序 wx.uploadFile无法上传解决办法  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何实现API版本控制_Laravel版本化API设计方案  如何在阿里云域名上完成建站全流程?  青岛网站建设如何选择本地服务器?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel怎么实现模型属性的自动加密  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何在建站之星绑定自定义域名?  iOS中将个别页面强制横屏其他页面竖屏  Laravel中的Facade(门面)到底是什么原理  网页制作模板网站推荐,网页设计海报之类的素材哪里好?