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


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


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




  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
Delphi ZXing是一款基于ZXing库的开源二维码识别工具。要实现批量识别二维码,我们可以按照以下步骤进行操作: 1. 导入ZXing库:首先,需要下载并导入ZXing库到Delphi中,可以从GitHub或其他资源站点获取。将库文件添加到Delphi项目中。 2. 创建批量识别功能:在Delphi中,我们可以使用循环结构来实现批量处理。例如,可以使用一个循环来遍历包含二维码图片文件名的文件夹。 3. 加载图片并识别二维码使用ZXing库提供的API,可以加载每个图片文件并进行二维码识别。可以通过将每个图片文件的路径传递给ZXing函数来实现。识别结果可以是文本形式或其他格式,取决于所选择的函数。 4. 处理识别结果:每次识别完成后,可以将结果保存到一个集合或数组中,以便进一步处理或显示。可以根据具体需求选择保存方式。 5. 显示或处理结果:可以根据需要将结果展示在界面上,例如在列表框或字符串列表中。还可以将结果导出到文本文件或数据库中进行进一步处理。 需要注意的是,ZXing库对二维码图片的清晰度和质量有一定要求。为了提高识别准确率,建议使用高分辨率、清晰度较高的图片。 总结来说,使用Delphi ZXing实现批量识别二维码的基本步骤包括导入库、创建批量处理功能、加载和识别图片、处理识别结果以及展示或保存结果。具体实现可以根据项目需求和开发者的经验进行调整和优化。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值