栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。

步骤:

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

2).生成二维码BufferedImage对象。代码如下:

 
 public static BufferedImage toBufferedImage(String text, int width, 
   int height) throws Exception { 
  int BLACK = 0xFF000000; 
  int WHITE = 0xFFFFFFFF; 
  Hashtable hints = new Hashtable(); 
  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).在立牌背景图的指定位置上生成二维码,代码如下:

 
 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).在立牌上加上立牌编号

 
 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 { 
 
  
 public static String DF_DATETIME = "yyyyMMdd"; 
 private static float alpha = 1f; 
 
  
 public static BufferedImage toBufferedImage(String text, int width, 
   int height) throws Exception { 
  int BLACK = 0xFF000000; 
  int WHITE = 0xFFFFFFFF; 
  Hashtable hints = new Hashtable(); 
  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; 
 } 
 
  
 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(); 
   } 
  } 
 } 
 
  
 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 static String toStr() { 
  return toStr(DF_DATETIME); 
 } 
 
  
 public static String toStr(String format) { 
  return toStr(format, new Date()); 
 } 
 
  
 public static String toStr(Date date) { 
  return toStr(DF_DATETIME, date); 
 } 
 
  
 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配置

 
   com.google.zxing 
   core 
   2.2 
   

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/148395.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号