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

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

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

(0)

相关推荐

  • java中ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android. 官网:ZXing github仓库 实战 本例演示如何在一个非 android 的 Java 项目中使用 ZXing 来生成.解析二维码图片. 安装 maven项目只需引入依赖: <dependency> <groupId>com.google.zxing

  • Java使用Google Zxing生成二维码的例子

    以前只用过jQuery.qrcode生成过二维码,这次使用的是Google的zxing通过Java代码生成二维码并以流的方式输出到前台页面 所需jar包:zxing-3.2.1.jar 代码 前台展示页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); S

  • Java实现二维码功能的实例代码

    最近突然想写一些文章,所以就陆陆续续的编写一些自我感觉有用的并且大家也可能用到的一些技术代码.方便互相学习交流. 今天这篇文章,主要是利用Java实现二维码: 在写代码之前先讲一下整体思路,以方便更好更快捷的实现功能. (1).首先要想实现二维码功能需要导入com.google.zxing的核心jar包,我这里导入的是core-3.2.1.jar; (2).所谓二维码莫过于把需要的内容放入一张图片中,所以这里首先是创建一张带有参数内容的图片,方法如下: private static Buffer

  • java ZXing生成二维码及条码实例分享

    1.jar包:   ZXing-core-3.3.0.jar http://mvnrepository.com/artifact/com.google.zxing/core   ZXing-javase-3.3.0.jar   http://mvnrepository.com/artifact/com.google.zxing/javase BufferedImageLuminanceSource.java package com.webos.util; import java.awt.Grap

  • java二维码生成的方法

    本文实例为大家分享了java二维码的实现代码,供大家参考,具体内容如下 这次用到的jar包是zxing,没有用到core的jar包 先导入zxing.jar包 生成二维码 package cn.huse.erweima; import java.io.File; import java.util.HashMap; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.go

  • Java生成二维码可添加logo和文字功能

    废话不多说,直接给大家贴代码了,具体代码如下所示: package com.luo.wctweb.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Date; imp

  • java实现二维码生成的几个方法(推荐)

    java实现二维码生成的几个方法,具体如下: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourcefor

  • 二维码生成Java实现代码

    本文实例为大家分享了二维码生成Java实现代码,供大家参考,具体内容如下 package com.yihaomen.barcode; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Shape; import java.awt.geom.RoundRectangle2D; import java.awt

  • Java中基于maven实现zxing二维码功能

    maven所需jar <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifac

  • 利用Java生成带有文字的二维码

    介绍 主要使用了goole的zxing包,下面给出了示例代码,很方便大家的理解和学习,代码都属于初步框架,功能有了,需要根据实际使用情况完善优化. 第一步.maven导入zxing <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency>

随机推荐