二维码工具类


准备工作:

  • pom.xml 引入依赖
<!-- 二维码 -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.1.0</version>
</dependency>

以下代码复制即可:(记得修改所在包名)

package replaceYourPackage;import java.awt.image.BufferedImage;import java.awt.Graphics2D;
import java.awt.Image;import java.io.File;
import java.io.FileNotFoundException;
import java.util.Hashtable;
import java.util.UUID;import javax.imageio.ImageIO;import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class QRCodeUtils {/*** 字符集:UTF-8*/public static final String UTF8_CHARSET = "UTF-8";/*** 字符集:UTF-16(包含中文建议使用UTF-8)*/public static final String UTF16_CHARSET = "UTF-16";/*** 字符集:GB2312(包含中文建议使用UTF-8)*/public static final String BG2313_CHARSET = "GB2312";/*** 字符集:GBK(包含中文建议使用UTF-8)*/public static final String GBK_CHARSET = "GBK";/*** 字符集:ISO-8859-1(包含中文建议使用UTF-8)*/public static final String ISO_8859_1_CHARSET = "ISO-8859-1";/*** 黑色不透明*/public static final int BLACK_COLOR = 0xFF000000;/*** 白色不透明*/public static final int WHITE_COLOR = 0xFFFFFFFF;/*** 蓝色不透明(支付宝蓝)*/public static final int BLUE_COLOR = 0xFF1677FF;/*** 绿色不透明(微信绿)*/public static final int GREEN_COLOR = 0xFF97E95F;/*** 大尺寸logo*/public static final double LARGE_LOGO = 3.0;/*** 中等尺寸logo*/public static final double MIDDLE_LOGO = 4.0;/*** 小尺寸logo*/public static final double SMALL_LOGO = 5.0;/*** 微小尺寸logo*/public static final double TINY_LOGO = 6.0;/*** 二维码保存至本地(外边距:1;背景是否透明:否;二维码颜色:黑色;背景颜色:白色;字符集:UTF-8;)* * @param imageFormat  图片格式(例:PNG;JPG...该参数会转化为文件名后缀)* @param fileName     文件名(不包含后缀!为空则通过UUID生成)* @param logoFilePath logo文件路径(为空则不添加logo)* @param logoSize     logo尺寸(占整个图片的比例分母,不存在logo传任何值不会产生影响)* @param savePath     保存目录路径(必填;路径不存在则自动创建)* @param content      二维码内容* @param size         图片尺寸(单位:像素)* @return 文件路径*/public static String saveQRCodeToLocal(String imageFormat, String fileName, String logoFilePath, double logoSize,String savePath, String content, int size) throws Exception {return saveQRCodeToLocal(imageFormat, fileName, logoFilePath, logoSize, savePath, content, 1, size, false,BLACK_COLOR, WHITE_COLOR, UTF8_CHARSET);}/*** 二维码保存至本地(外边距:1;背景是否透明:否;二维码颜色:黑色;背景颜色:白色;)* * @param imageFormat  图片格式(例:PNG;JPG...该参数会转化为文件名后缀)* @param fileName     文件名(不包含后缀!为空则通过UUID生成)* @param logoFilePath logo文件路径(为空则不添加logo)* @param logoSize     logo尺寸(占整个图片的比例分母,不存在logo传任何值不会产生影响)* @param savePath     保存目录路径(必填;路径不存在则自动创建)* @param content      二维码内容* @param size         图片尺寸(单位:像素)* @param charset      字符集(包含中文建议使用UTF-8)* @return 文件路径*/public static String saveQRCodeToLocal(String imageFormat, String fileName, String logoFilePath, double logoSize,String savePath, String content, int size, String charset) throws Exception {return saveQRCodeToLocal(imageFormat, fileName, logoFilePath, logoSize, savePath, content, 1, size, false,BLACK_COLOR, WHITE_COLOR, charset);}/*** 二维码保存至本地* * @param imageFormat     图片格式(例:PNG;JPG...该参数会转化为文件名后缀)* @param fileName        文件名(不包含后缀!为空则通过UUID生成)* @param logoFilePath    logo文件路径(为空则不添加logo)* @param logoSize        logo尺寸(占整个图片的比例分母,不存在logo传任何值不会产生影响)* @param savePath        保存目录路径(必填;路径不存在则自动创建)* @param content         二维码内容* @param margin          外边距(例:0;1;2;....)* @param size            图片尺寸(单位:像素)* @param transparent     是否透明(图片格式为"PNG"才可生效)* @param codeColor       二维码颜色值(ARGB颜色值,例:0xFF000000;前两位为透明度,后六位为颜色值;)* @param backgroundColor 背景颜色值(ARGB颜色值,例:0xFFFFFFFF;前两位为透明度,后六位为颜色值;)* @param charset         字符集(包含中文建议使用UTF-8)* @return 文件路径*/public static String saveQRCodeToLocal(String imageFormat, String fileName, String logoFilePath, double logoSize,String savePath, String content, int margin, int size, boolean transparent, int codeColor, int backgroundColor,String charset) throws Exception {// 图片格式去空格转大写imageFormat = imageFormat.trim().toUpperCase();// 检查文件储存路径是否为空if (savePath == null || savePath.isBlank())throw new FileNotFoundException("文件储存路径不得为空");// 检查图片格式if (!"PNG".equals(imageFormat))transparent = false;// 生成二维码BufferedImage qrCodeImage = generateQRCode(content, margin, size, transparent, codeColor, backgroundColor,UTF8_CHARSET);// 检查是否存在logo文件路径if (logoFilePath != null && !logoFilePath.isBlank())// 二维码添加logoaddLogo(qrCodeImage, getLogoImage(logoFilePath), logoSize);// 创建文件存放目录mkdirs(savePath);// 检查文件名是否存在if (fileName == null || fileName.isBlank())// 生成文件名fileName = UUID.randomUUID().toString().replace("-", "").toLowerCase() + "." + imageFormat.toLowerCase();// 拼接文件路径String filePath = savePath + "/" + fileName;// 写出二维码ImageIO.write(qrCodeImage, imageFormat, new File(filePath));// 返回文件路径return filePath;}/*** 生成二维码(外边距:1;背景是否透明:否;二维码颜色:黑色;背景颜色:白色;字符集:UTF-8;)* * @param content 内容* @param size    图片尺寸* @return 二维码图片*/public static BufferedImage generateQRCode(String content, int size) throws Exception {return generateQRCode(content, 1, size, false, BLACK_COLOR, WHITE_COLOR, UTF8_CHARSET);}/*** 生成二维码(外边距:1;背景是否透明:否;二维码颜色:黑色;背景颜色:白色;)* * @param content 内容* @param size    图片尺寸* @param charset 字符集(包含中文建议使用UTF-8)* @return 二维码图片*/public static BufferedImage generateQRCode(String content, int size, String charset) throws Exception {return generateQRCode(content, 1, size, false, BLACK_COLOR, WHITE_COLOR, charset);}/*** 生成二维码* * @param content         内容* @param margin          外边距* @param size            图片尺寸* @param transparent     背景是否透明* @param codeColor       二维码颜色值(ARGB颜色值,例:0xFF000000;前两位为透明度,后六位为颜色值;)* @param backgroundColor 背景颜色值(ARGB颜色值,例:0xFFFFFFFF;前两位为透明度,后六位为颜色值;)* @param charset         字符集(包含中文建议使用UTF-8)* @return 二维码图片*/public static BufferedImage generateQRCode(String content, int margin, int size, boolean transparent, int codeColor,int backgroundColor, String charset) throws Exception {// 二维码编码设置Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 设置误差修正hints.put(EncodeHintType.MARGIN, margin); // 设置二维码空白区域大小hints.put(EncodeHintType.CHARACTER_SET, charset); // 设置字符集// 位矩阵BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);// 创建图片BufferedImage image;// 判断是否透明if (transparent)image = new BufferedImage(bitMatrix.getWidth(), bitMatrix.getHeight(), BufferedImage.TYPE_INT_ARGB);elseimage = new BufferedImage(bitMatrix.getWidth(), bitMatrix.getHeight(), BufferedImage.TYPE_INT_RGB);// 绘制位矩阵图paintBitMatrixImage(bitMatrix, image, transparent, codeColor, backgroundColor);// 返回二维码return image;}/*** 添加logo* * @param qrCodeImage 二维码图片* @param logoImage   logo图片* @param logoSize    logo尺寸(占整个图片的比例分母)* @return 带logo的二维码*/public static void addLogo(BufferedImage qrCodeImage, BufferedImage logoImage, double logoSize) {// 计算logo缩放宽高int logoWidth = (int) (qrCodeImage.getWidth() / logoSize);int logoHeight = (int) (qrCodeImage.getHeight() / logoSize);// 缩放logoImage zoomImage = logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);// 创建画笔Graphics2D g = qrCodeImage.createGraphics();// 将logo绘制到二维码上g.drawImage(zoomImage, (qrCodeImage.getWidth() - logoWidth) / 2, (qrCodeImage.getHeight() - logoHeight) / 2,logoWidth, logoHeight, null);// 释放画笔g.dispose();}/*** 解析二维码(字符集:UTF-8)* * @param filePath 文件路径* @return 解析后二维码内容*/public static String parseQRCode(String filePath) throws Exception {return parseQRCode(filePath, UTF8_CHARSET);}/*** 解析二维码* * @param filePath 文件路径* @param charset  字符集(包含中文建议使用UTF-8)* @return 解析后二维码内容*/public static String parseQRCode(String filePath, String charset) throws Exception {// 读取文件File qrCodeImageFile = new File(filePath);// 检查文件是否存在if (!qrCodeImageFile.exists())throw new FileNotFoundException();// 返回解析后二维码内容return parseQRCode(ImageIO.read(qrCodeImageFile), charset);}/*** 解析二维码(字符集:UTF-8)* * @param qrCodeImage 二维码图片* @return 解析后二维码内容*/public static String parseQRCode(BufferedImage qrCodeImage) throws Exception {return parseQRCode(qrCodeImage, UTF8_CHARSET);}/*** 解析二维码* * @param qrCodeImage 二维码图片* @param charset     字符集(包含中文建议使用UTF-8)* @return 解析后二维码内容*/public static String parseQRCode(BufferedImage qrCodeImage, String charset) throws Exception {// 解码设置Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, charset); // 设定字符集// 图像解析为亮度源BufferedImageLuminanceSource luminanceSource = new BufferedImageLuminanceSource(qrCodeImage);// 亮度源解析为二进制位图BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(luminanceSource));// 二维码解码Result result = new MultiFormatReader().decode(bitmap, hints);// 解析后二维码内容return result.getText();}/*** 绘制位矩阵图* * @param bitMatrix       位矩阵* @param image           图片* @param transparent     是否透明(true:透明 / false:不透明)* @param codeColor       二维码颜色值(ARGB颜色值,例:0xFF000000;前两位为透明度,后六位为颜色值;)* @param backgroundColor 背景颜色值(ARGB颜色值,例:0xFFFFFFFF;前两位为透明度,后六位为颜色值;)*/private static void paintBitMatrixImage(BitMatrix bitMatrix, BufferedImage image, boolean transparent, int codeColor,int backgroundColor) {// 检查是否透明if (transparent) {// 透明// 绘制位矩阵图for (int x = 0; x < bitMatrix.getWidth(); x++)for (int y = 0; y < bitMatrix.getHeight(); y++)if (bitMatrix.get(x, y))image.setRGB(x, y, codeColor);} else { // 不透明// 绘制位矩阵图for (int x = 0; x < bitMatrix.getWidth(); x++)for (int y = 0; y < bitMatrix.getHeight(); y++)image.setRGB(x, y, bitMatrix.get(x, y) ? codeColor : backgroundColor);}}/*** 获取logo图片* * @param logoFilePath logo文件路径* @return logo图片*/private static BufferedImage getLogoImage(String logoFilePath) throws Exception {// 读取logo文件File file = new File(logoFilePath);// 检查logo文件是否存在if (!file.exists())throw new FileNotFoundException();// 读取logo图片BufferedImage logoImage = ImageIO.read(file);// 返回logo图片return logoImage;}/*** 创建文件夹* * @param path 路径*/private static void mkdirs(String path) {File file = new File(path);// 检查目录是否存在if (!file.exists() && !file.isDirectory())file.mkdirs(); // 不存在则创建目录}
}

Java二维码工具类(超详细注释)相关推荐

  1. Java二维码工具类(使用zxing实现,可支持logo)

    本工具类基于Google二维码框架zxing3.1.0实现. 1. pom.xml中依赖包设置 <dependency><groupId>com.google.zxing< ...

  2. java将链接生成二维码工具类

    一.添加依赖 <!-- 生成二维码--><dependency><groupId>com.google.zxing</groupId><artif ...

  3. Java生成和解析二维码工具类(简单经典)

    Java生成和解析二维码工具类 开箱即用,简单不废话. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  4. java生成二维码工具类

    1,先引入谷歌的插件zxing的maven坐标 <!-- 二维码 --><dependency><groupId>com.google.zxing</grou ...

  5. 分享一个Java生成二维码工具类

    分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...

  6. com.google.zxing 二维码工具类

    com.google.zxing 二维码工具类 pom 工具类 使用 pom <dependency><groupId>com.google.zxing</groupId ...

  7. 2021-08-26(条形码,二维码工具类生成)

    公司需要对商品的条码值生成对应的条形码,目前市面上的有的条码库分为: JBarcode,zxing jbarcode这个包在maven的官方仓库找不到,所以需要自己添加到本地仓库然后编写pom文件就可 ...

  8. JAVA调用TSC打印机打印标签(二维码,数据等)超详细!!

    本文打印机型号: TSC MA3400P 后端调用tsc打印机是通过DLL来进行调用的,首先你需要两个TSC文件直接复制到项目目录下边即可 可以直接去官网下载:https://www.chinatsc ...

  9. Android-生成二维码工具类

    目录 二维码生成工具类 二维码生成工具类 /*** 生成条形码和二维码的工具*/ public class ZXingUtils {/*** 生成二维码 要转换的地址或字符串,可以是中文** @par ...

最新文章

  1. java程序无法启动_由于Java程序,Tomcat无法启动
  2. 莫斯科保卫战之PHP-502 Bad Gateway
  3. 【正一专栏】恒大中超七连冠到手了
  4. CodeForces - 123B Squares(简单几何+旋转坐标系)
  5. java jol原理_Java对象布局(JOL)实现过程解析
  6. Win10系统怎么锁定IE浏览器主页
  7. 适配器模式(PHP实现)
  8. 【Linux】Linux Systemd 启动守护进程
  9. 数学建模算法与应用_《数学建模算法与应用》笔记【1】
  10. (二) js + Vue 写扫雷
  11. 树莓派linux系统识别u盘启动,U盘安装树莓派系统,利用U盘启动Raspberry
  12. 如何判断如何判断RS232线是直连还是交叉连线
  13. Gluster (一)安装
  14. 联想拯救者y7000p加内存条_联想 拯救者Y7000P 怎么升级内存?
  15. SocialFi 何以成就 Web3 去中心化社交未来
  16. Windows10应用程序无法正常启动Oxc000007b 实用解决方法
  17. HTTP协议之GET与POST区别
  18. android_day01
  19. Ultra Librarian 的安装和使用
  20. android 磁力解析,关于手机端磁力下载,看这篇教程就够了

热门文章

  1. 多个Repeater嵌套
  2. oracle数据库触发器怎么查询后插入,[求助][Oracle][ORA-00604][ORA-02067]触发器被触发时向远程数据库插入数据...
  3. 使用css和js实现鼠标拖尾特效(七彩泡泡)
  4. csgo进创意工坊显示专用服务器,国服CSGO加载Steam创意工坊的图
  5. 人脸识别智能锁的发展选择
  6. Linux:安装最新版本R + Rstudio成功使用最新R
  7. 【leetcode】快乐数
  8. 毕业工作五年的总结和感悟(中)
  9. 机械材料热处理工艺1(必备知识点)
  10. IPV4和IPV56的区别