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



时间: 2024-10-05 21:27:40

使用zxing批量生成二维码立牌的相关文章

C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(一)

一.ZXing.Net 源代码地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如图: 说明:ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android.现在也有了对应的.Net版本 二.生成二维码 将字符编码时可以指定字符格式:默认为ISO-8859-1英文字符集,但一般移动设备常用UTF-8字符

【VB.NET】利用 ZXing.Net 生成二维码(支持自定义LOGO)

ZXing .NET 的项目主页https://zxingnet.codeplex.com/ 代码基本上抄袭自下面两篇文章 XDhttp://www.cnblogs.com/tianma3798/p/5426869.htmlhttp://www.cnblogs.com/tianma3798/p/5426880.html 仅作参数优化,更加实用和简便一点 Shared Function MakeQR(ByVal qrtext As String, Optional ByVal width As I

使用python调用zxing库生成二维码图片

(1)     安装Jpype 用python调用jar包须要安装jpype扩展,在Ubuntu上能够直接使用apt-get安装jpype扩展 $ sudo apt-get install python-jpype 关于使用Jpype调用jar包的方式.请看http://blog.csdn.net/niuyisheng/article/details/9002926 (2)     得到zxing  jar包 使用zxing第三方库生成二维码图片,关于zxing的介绍能够看其github地址:h

c# 使用ZXing.Net生成二维码

生活中使用二维码还是很多的,前段时间公司领导让研究一下二维码,所以,在这写下研究的心得. 生成二维码的途径一般有两种,一是,通过前端方式生成二维码使用 QRCode.js生成二维码,二就是通过服务端代码生成,这里主要说服务器端的生成二维码的方式. 一,首先服务端生成二维码,通过调用dll就可以了,比较常用的dll有两种一种是QrCode.Net另一种是ZXing.Net,我选择了ZXing.Net来生成二维码. 二,下载ZXing.dll 下载地址 http://zxingnet.codeple

批量生成二维码

一个简单的批量二维码生成器 最近需要将大量的字符串生成二维码, 网上找了很多网站和应用都不是很理想,干脆自己做了吧! github 上找了下找到QrCode 开源项目 QrCode 开源类库 安装qrcode非常简单,参考这里 引用 dll using QrCode 核心逻辑 /// <summary> /// /// </summary> /// <param name="filename"></param> /// <param

利用ZXing插件生成二维码

using System.Drawing; using ZXing; using ZXing.QrCode; /// <summary> /// 生成二维码 /// </summary> /// <param name="dirPath">路径</param> /// <returns></returns> private string GenerateQRCode(string dirPath) { Barcod

批量生成二维码打包成exe文件

需求:  根据url 和 文件名称 生成二维码   将二维码放到背景图上合成一张二维码 思路: 使用qrcode库 获取二维码 保存本地  全部完成后 与本地背景图合成   最后使用pyinstaller将python打包成exe文件 # -*- coding: utf-8 -*- import urllib; import os import time import threadpool from PIL import Image import qrcode path = os.getcwd(

Java通过Zxing生成二维码

今天,要完成一个批量生成二维码的工作,并将生成好的二维码与另外一张底图拼接,生成一张新图. Java生成二维码主要的sdk为,qrcode和zxing,二者差别不大,这里采用了zxing. 首先,直接使用其core.jar,然后实现MatrixToImageWriter类. 在使用zxing时,我们发现默认生成的白边太大,想进行修改,通过updateBit方法进行指定白边的宽度.在修改完其白边后,会影响默认设置的二维码大小,通过zoomInImage方法进行修复. 在合成两张图片时,通过Smal

Asp.Net Core在线生成二维码

前言: 原先用zxing Code写过基于Winfrom的批量生成二维码工具,以及单个生成二维码工具:批量生成二维码Gihub源代码 今天尝试用QRCoder 加 Asp.Net Core 写了一个在线生成二维码的例子,并且保存图片到Ubuntu系统: 代码: 生成二维码所需要用到的包:QRCoder 根据Github上的源代码,引用NuGet包 PM> Install-Package QRCoder 根据传入的参数,生成二维码,并且保存图片 public static void QRCode(