使用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));// 设置 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




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255547.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Hardware】串口驱动

1. Serial Type 1.1. 物理接口形式 UART接口&#xff1a;通用异步收发器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;UART是串口收发的逻辑电路&#xff0c;这部分可以独立成芯片&#xff0c;也可以作为模块嵌入到其他芯片里&#xff0c;单片机、S…

年轻人不讲武德,竟用Python让马老师表演闪电五连鞭!

11月份的头条&#xff0c;是属于马保国的。 一位69岁的老同志&#xff0c;惨遭年轻人偷袭&#xff0c;不讲武德。 看看把老同志欺负的... 要不是马老师讲仁义讲道德&#xff0c;甩手就是一个五连鞭。 哈哈哈&#xff0c;所以本期我们就用Python给马保国老师做一个闪电五连鞭动态…

git配置git kraken

安装完Git karken之后&#xff0c;不能直接使用&#xff0c;否则在使用过程中会一直错误提示&#xff1a;ssh key错误…什么什么的&#xff0c;还需要配置一下&#xff1a; 1&#xff0c;安装Git Karken 安装完git kraken后&#xff0c;会生成一个gitkraken_rsa.pub文件&…

gitkraken汉化

想要汉化gitkraken&#xff0c;上链接&#xff0c;下载解压 链接&#xff1a;https://pan.baidu.com/s/136cQzS7_SsIazhyF1IojsQ 提取码&#xff1a;0lzb 01 双击运行install.bat 02 将string.json拖动到刚才第一步打开的窗口 03 按下回车键 04 输入gitkraken汉化的版本…

GitCracken

GitCracken Git可视化软件GitCracken激活流程 1.要求 - 下载 Node.js v12 LTS或更高版本并安装 - 下载 yarn 并安装 2. 激活流程 - 克隆源码到任意文件 git clone https://github.com/5cr1pt/GitCracken.git - 进入到源码文件 cd GitCracken/GitCracken/ - 执行命令 yarn in…

gitkraken无法打开私有仓库的解决办法

gitkraken无法打开私有仓库的解决办法 有条件的请支持正版&#xff0c;发博客的目的主要是为了还在学习没有经济能力的开发人员 该博客主要根据以下博客的基础上增加解释和补充还有失效链接的补充https://blog.csdn.net/Burnup_110/article/details/117252275?spm1001.2014.…

ubuntu 安装 Gitkraken 9.x Pro 版本

GitKraken 是一个非常好用的 Git 图形界面客户端, 并且支持 Linux 平台, 但 6.5.1 版本以后 GitKraken 对私有仓库不再免费开放使用 本文介绍一个 ubuntu 安装 GitKraken 9.x Pro 版本的方法 2023.04.04 更新: 更换 GitCracken, 支持最新的 9.2.1 版本 参考 https://blog.csdn…

GitKraKen 9.x|7.5.1|6.5.0 - 安装

历史版本下载&#xff08;改改版本号就行&#xff09; Linux-deb : https://release.axocdn.com/linux/GitKraken-v7.5.1.debLinux-rpm : https://release.axocdn.com/linux/GitKraken-v7.5.1.rpmLinux-tar.gz : https://release.axocdn.com/linux/GitKraken-v7.5.1.tar.gzWin…

[git版本管理]使用Gitee配合GitKraken管理私有项目

1 使用Gitee项目创建并clone到本地 新建仓库 设置设置名称和路径 复制git地址,然后在终端通过git clone 下载仓库到本地 git clone https://gitee.com/cslibowen/my_project.git下面会提示你clone了一个空仓库,但是此时你的仓库其实并不是空的,打开之后my_project可以看到…

Git 客户端::Git Fork 注册版-NEW

Git Fork 是最简单有效的 Windows 客户端之一。许多开发人员正在使用此版本控制程序&#xff0c;它允许您协作处理您的项目。具有类似这样的用户界面的客户端可以使您的工作更轻松。 Fork 的 Fork 界面非常人性化。在右侧的左侧有大量的存储库和分支、标签、来源和藏匿处。此外…

git fork操作

Git fork操作 文章目录 Git fork操作一.背景二.概念1.与git clone的区别&#xff1f;2.用法流程 三.实操1. fork仓库2. 分支创建与提交 一.背景 最近我在github上发现一个很有意思的项目&#xff0c;看了其中相关的源码&#xff0c;而我呢&#xff0c;又很想加入其中&#xff0…

GitKraken

GitKraken 1 介绍2 下载地址3 禁掉更新参考 1 介绍 GitKraken是一款Git客户端&#xff0c;它使用图形化的界面&#xff0c;以减少命令行操作&#xff0c;安装使用不需要任何依赖&#xff0c;可以在界面上查看和移动窗口&#xff0c;还可以进行搜索&#xff1b;gitkraken还可以…

【Gitkraken】Gitkraken使用教程

工作区、暂存区、本地仓库 先来看下面这张图&#xff1a; Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09; Remote&#xff1a;远程仓库 从工作区到暂存区再到提交本地仓库 写在前面&#x…

GitKraken使用指南

一名合格的程序员对Git的熟悉是必不可少&#xff0c;当然Git的使用其实不需要GUI工具就能够很好的运用了&#xff0c;GitKraken软件这个功能就是简单容易上手&#xff0c;非常的强大。 【使用指南】 如何在Cooding平台使用 在这里将你自己的Clone URL 粘贴进入。 然后输入Coodi…

GitKraken Pro安装

GitKraken Pro安装 &#x1f680; 简介 GitKraken是一款Git客户端&#xff0c;拥有直观的 Git GUI 和强大的 CLI。非常直观的GUI界面&#xff0c;以减少命令行操作&#xff0c;同时新版本还拥有强大的CLI&#xff0c;也就是命令行交互功能&#xff0c;如果你习惯了命令行操作&…

[git可视化软件]gitkraken平替:GitAhead

日期2023-02-28 gitkraken6.5.1已经不能登陆使用了!! 6.5.1免费版已经无法使用!!! 现在是2023-02-28 这款工具已经废除了6.5.1版本的使用功能了,我直接卡在登陆界面进不去项目了. 要想继续管理私有项目,只能升级最新版的软件,并且开通会员.会员费用高的一批,一年要59.4美元.约…

linux 安装gitkraken

目录 1 首先在你的计算机上安装git 2 进入命令行&#xff0c;下载tar包&#xff1a; 3 将包解压到/opt: 4 在usr/local/bin中建立一个指向/opt/gitkraken/gitkraken的软连接 5 在命令行输入 6 在命令行输入如下指令&#xff0c;启动gitkraken 1 首先在你的计算机上安装git…

gitk详解

前言&#xff1a; gitk是git图形化的界面软件版本&#xff0c;对仓库的管理更为直观&#xff0c;不需要在命令行中进行繁琐的控制&#xff0c;将各种信息合理的组织在不同的软件窗口中&#xff0c;让一些很繁琐的操作可以在图像软件中只需要一键获得。合理的结合命令行和图形工…

GitKraken使用—01、GitKraken的安装与破解

0、GitKraken是什么&#xff1f; GitKraken是基于Git代码管理的一个UI管理器&#xff0c;拥有非常精美的界面&#xff0c;可以配合Github、Gitee来使用。 1、GitKraken的下载 我们选择安装GitKraken6.5.1版本&#xff0c;因为GitKraken6.5.1版本时唯一一个免费的版本&#x…

git图形化工具GitKraken的使用——初始化项目

最近看了关于git工作流的一些东西&#xff0c;刚开始用的SourceTree图形工具&#xff0c;发现这个工具在windows上并不是很好用&#xff0c;昨天在网上找到一个酷炫的git图形工具——GitKraken&#xff0c;初步使用了一下&#xff0c;觉得挺好用的&#xff0c;首先它是英文的&a…