java中使用zxing批量生成二维码立牌
发布时间:2020-12-14 14:39:56 所属栏目:Java 来源:网络整理
导读:使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。 步骤: 1).做好背景图,如下图: 2).生成二维码BufferedImage对象。代码如下: /** * * @Title: toBufferedImage * @Descri
使用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,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),Image.SCALE_SMOOTH),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,BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); // 开文字抗锯齿 去文字毛刺 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.drawImage(src,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,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",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,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,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,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> 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |