使用zxing生成二维码
使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,
最后加上立牌编号。
步骤:
1).做好背景图,如下图:
扫一扫添加关注
2).生成二维码BufferedImage对象。代码如下:
[java] view plaincopy
- /**
- *
- * @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).在立牌背景图的指定位置上生成二维码,代码如下:
[java] view plaincopy
- /**
- *
- * @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).在立牌上加上立牌编号
[java] view plaincopy
- /**
- *
- * @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();
- }
- }
示例:
代码:
测试代码
[java] view plaincopy
- 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代码:
[java] view plaincopy
- 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>
使用zxing生成二维码相关推荐
- Zxing生成二维码思路和源码解析
Zxing生成二维码思路和源码解析 本博文是一篇介绍google zxing包生成二维码的思路和它的源码的文章. 一.引入 如何调用zxing的代码生成一个二维码呢?主要的函数只有一个,如下所示: B ...
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...
- 五十九、使用ZXing生成二维码
@Author:Runsen @Date:2020/7/12 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- 27.用zxing生成二维码
先在idea里面导入jar包 链接:https://pan.baidu.com/s/1UdorNg8o0A4FsElghqkJyw 提取码:c4bt 复制这段内容后打开百度网盘手机App,操作更方便哦 ...
- zxing 生成二维码,可设置logo、二维码颜色、白边大小
主要是使用google的zxing 生成二维码,可设置logo.二维码前景色/后景色.白边大小.二维码大小 1.用到jar包 <dependency><groupId>com. ...
- 用ZXING生成二维码的工具类(可以去掉白边,添加logo)
===========================用ZXING生成二维码的工具类(可以去掉白边,添加logo)========================== /** * @auther g ...
- Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码
Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...
- Spring Boot电商项目57:订单模块六:【前台:生成支付二维码】接口;(支付url的拼凑;利用zxing生成二维码;二维码图片的存储;真实地址与可访问地址的转换;)
说明: (1)本篇博客主要内容是:开发[前台:生成支付二维码]接口: (2)本篇博客需要注意的点有: ● 支付url的拼凑: ● 利用zxing生成二维码: ● 二维码图片的存储:真实地址与可访问地址 ...
- zxing生成二维码及解析二维码
ZXing生成二维码 1.下载jar https://github.com/ZF520/QRCode/raw/master/zxing/bin/lib/zxing3.3.1.jar 2.生成二维码的函 ...
- 基于zxing生成二维码
目录 1.二维码的原理 2.基于zxing生成二维码 3.逻辑及其应用 完整代码:https://github.com/122537067/zxingQRcodeLogoColor 效果图: 1.二维 ...
最新文章
- Tips/Tricks#0:母版页中对控件ID的处理
- macappstore登不上去_武功山观星归来,缆车登顶,不徒步攻略!
- EasyUI学习总结(二)——easyloader分析与使用
- go var 一个整数_Go语言学习基础-值、变量、常量
- Spring 2.5新特性及架构图
- macos 此服务器的证书无效_网易出现重大失误,忘记续费HTTPS证书导致大量用户受影响...
- 生长区域算法的php实现
- MATLAB —— 低通滤波器设计与信号滤波
- 兄弟打印机内存已满清零方法_兄弟打印机清零方法
- python身份证号查询信息
- 2019年中国航空三字代码对照表完全汇总
- 【数学】几何在线画图
- 安装Powerdesigner16.5
- LM358恒流恒压原理
- 你的成就只能代表着你过去的努力程度
- Dev中GridView——背景颜色改变
- NUC安装CentOS-8.2
- 欧盟 GDPR 通用数据保护条例正式生效后,各行业影响分析
- 珞珈一号01星(luojia1-01)的夜间灯光影像python爬取
- mysql 恢复 innodb_MySQL:Innodb恢复的学习笔记
热门文章
- torque+maui作业调度
- 技术分享 | 使用 C++20 Ranges 标准库实现日历程序
- linux一键安装rdp脚本,linux使用一键安装远程桌面环境/RDP脚本遇到问题与解决
- Selenium之如何定位隐藏div弹窗
- notepad++下载和安装
- RDB内存快照:Redis如何实现快速恢复数据
- java list集合合并_JAVA List合并集合
- 【错误录】System.UnauthorizedAccessException: 对路径的访问被拒绝?
- whereis, which详解
- Vmware与主机间共享文件的七种方法(附图+详解)