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


---------------------------------------------------------------------------版权声明------------------------------------------------------------------------------------------


版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/mr_smile2014




GitHub 加速计划 / zx / zxing
32.53 K
9.31 K
下载
ZXing ("Zebra Crossing") barcode scanning library for Java, Android
最近提交(Master分支:2 个月前 )
8944e607 3 个月前
6ea3726b Bumps `spring.version` from 6.1.5 to 6.1.8. Updates `org.springframework:spring-test` from 6.1.5 to 6.1.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.1.5...v6.1.8) Updates `org.springframework:spring-web` from 6.1.5 to 6.1.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.1.5...v6.1.8) --- updated-dependencies: - dependency-name: org.springframework:spring-test dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.springframework:spring-web dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sean Owen <srowen@gmail.com> 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐