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>

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

以上是 java中使用zxing批量生成二维码立牌 的全部内容, 来源链接: utcz.com/p/210791.html

回到顶部