使用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));// 设置 Fontg.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位数字如20161214000001String 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));// 设置 Fontg.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