提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、引入相关依赖
  • 二、使用步骤
  • 三、测试

一、引入相关依赖

<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version>
</dependency>

二、使用步骤

1、生成二维码工具类

package com.geesun.QCCode;import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
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;
import org.apache.commons.lang.StringUtils;
import sun.font.FontDesignMetrics;/*** 二维码生成工具*/
public class QRCodeUtilEx {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "png";// 二维码尺寸private static final int QRCODE_SIZE = 400;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;// 字体大小private static final int FONT_SIZE = 18;@SuppressWarnings({ "unchecked", "rawtypes" })private static BufferedImage createImage(String content, String bottomDes, String imgPath, boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();int tempHeight = height;boolean needDescription = (null != bottomDes && !"".equals(bottomDes));if (needDescription) {tempHeight += 30;}BufferedImage image = new BufferedImage(width, tempHeight, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 插入图片if (imgPath != null && !"".equals(imgPath)) {QRCodeUtilEx.insertImage(image, imgPath, needCompress);}//添加底部文字if (needDescription) {QRCodeUtilEx.addFontImage(image, bottomDes);}return image;}/*** 添加 底部图片文字* @param source      图片源* @param declareText 文字本文*/private static void addFontImage(BufferedImage source, String declareText) {BufferedImage textImage = strToImage(declareText, QRCODE_SIZE, 50);Graphics2D graph = source.createGraphics();//开启文字抗锯齿graph.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);int width = textImage.getWidth(null);int height = textImage.getHeight(null);Image src = textImage;graph.drawImage(src, 0, QRCODE_SIZE - 20, width, height, null);graph.dispose();}@SuppressWarnings("restriction")private static BufferedImage strToImage(String str, int width, int height) {BufferedImage textImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g2 = (Graphics2D)textImage.getGraphics();//开启文字抗锯齿g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2.setBackground(Color.WHITE);g2.clearRect(0, 0, width, height);g2.setPaint(Color.BLACK);FontRenderContext context = g2.getFontRenderContext();Font font = new Font("微软雅黑", Font.BOLD, FONT_SIZE);g2.setFont(font);LineMetrics lineMetrics = font.getLineMetrics(str, context);FontMetrics fontMetrics = FontDesignMetrics.getMetrics(font);float offset = (width - fontMetrics.stringWidth(str)) / 2;float y = (height + lineMetrics.getAscent() - lineMetrics.getDescent() - lineMetrics.getLeading()) / 2;g2.drawString(str, (int)offset, (int)y);return textImage;}private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + "   该文件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}/*** @param content 二维码的内容* @param bottomDes  底部的文字* @param imgPath      Logo 图片地址* @param destPath 保存二维码 地址 (没有该目录会自动创建)* @param needCompress 是否压缩Logo大小* @param fileName    文件名称* @param fileEnd   文件后缀* @throws Exception*/public static void encode(String content, String bottomDes, String imgPath, String destPath, boolean needCompress, String fileName, String fileEnd) throws Exception {BufferedImage image = QRCodeUtilEx.createImage(content, bottomDes, imgPath, needCompress);mkdirs(destPath);String file = (StringUtils.isEmpty(fileName) ? UUID.randomUUID().toString() : fileName) +"." + (StringUtils.isEmpty(fileEnd) ? FORMAT_NAME : fileEnd);ImageIO.write(image, FORMAT_NAME, new File(destPath + "/" + file));}/*** @param content 二维码的内容* @param bottomDes   底部的文字* @param imgPath      Logo 图片地址* @param needCompress 是否压缩Logo大小* @return* @throws Exception*/public static BufferedImage encode(String content, String bottomDes, String imgPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtilEx.createImage(content, bottomDes, imgPath, needCompress);return image;}/*** 创建文件夹* @param destPath*/public static void mkdirs(String destPath) {File file = new File(destPath);// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}/*** @param content 二维码的内容* @param bottomDes 底部的文字* @param imgPath      Logo 图片地址* @param destPath 保存二维码 地址 (没有该目录会自动创建)* @throws Exception*/public static void encode(String content, String bottomDes, String imgPath, String destPath) throws Exception {QRCodeUtilEx.encode(content, bottomDes, imgPath, destPath, false, null, null);}/*** @param content 二维码的内容* @param bottomDes 底部的文字* @param destPath 保存二维码 地址 (没有该目录会自动创建)* @throws Exception*/public static void encode(String content, String bottomDes, String destPath) throws Exception {QRCodeUtilEx.encode(content, bottomDes, null, destPath, true, null, null);}/*** @param content 二维码的内容* @param bottomDes 底部的文字* @param destPath 保存二维码 地址 (没有该目录会自动创建)* @param fileName 文件名称* @param fileEnd   文件后缀* @throws Exception*/public static void encode(String content, String bottomDes, String destPath, String fileName, String fileEnd) throws Exception {QRCodeUtilEx.encode(content, bottomDes, null, destPath, true, fileName, fileEnd);}public static void encode(String content, String bottomDes, String imgPath, OutputStream output, boolean needCompress)throws Exception {BufferedImage image = QRCodeUtilEx.createImage(content, bottomDes, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, String bottomDes, OutputStream output) throws Exception {QRCodeUtilEx.encode(content, bottomDes, null, output, false);}/*** 解析二维码传入路径文件* @param file* @return* @throws Exception*/public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}/*** 解析二维码传入路径* @param path* @return* @throws Exception*/public static String decode(String path) throws Exception {return QRCodeUtilEx.decode(new File(path));}}

三、测试

1、进行单元测试

2、代码:

     @Testpublic void Test02() throws Exception {//二维码内容String content = "Hello World";//底部内容String bottomDes = "1-100-200-300";//二维码名称String replace = "hello";//logo路径String logoPath = "E:\\geesun.jpg";//保存二维码地址String destPath = "E:\\";//生成二维码QRCodeUtilEx.encode(content,bottomDes,logoPath,destPath,true,replace,"png");}

3、效果

4、打开二维码效果:

进行微信扫码或者其它扫码就能获取到内容

Java生成二维码以及解码相关推荐

  1. Java生成二维码与解码二维码

    下载QRCode.jar包 下载完成后在cmd命令行执行以下命令 mvn install:install-file -Dfile = QRCode的路径 -DgroupId=QRCode -Darti ...

  2. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  3. java 生成二维码后叠加LOGO并转换成base64

    1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception {String data = ...

  4. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  5. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  6. java生成二维码打印到浏览器

    java生成二维码打印到浏览器 解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

  7. Java生成二维码带LOGO底部标题竖版字体

    前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...

  8. java生成二维码,并在前端展示。

    java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...

  9. java生成二维码(链接生成二维码)

    Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...

最新文章

  1. Ubuntu14.04 64位上配置终端显示git分支名称
  2. 转- java单例模式几种实现方式
  3. 前端开发网络——Ajax(GET、POST)
  4. 岳云鹏:买128G手机仅112G可用!手机系统占用存储空间应厂商消化?
  5. IBM参与马鞍山模式创新 为中国医疗信息化立新示范
  6. scratch python插件_Scratch3.0设计的插件系统(上篇)
  7. TOGAF 企业连续系列
  8. 熊出没之伐木机器人_熊出没:最强大的4大机器人登场,熊大熊二“苦不堪言”...
  9. nginx代理邮件服务
  10. 中关村e谷:产业服务终靠一颗赤诚之心
  11. php红包退回通知,php红包
  12. 往hive表中插入与导出数据方式load ,insert ,sqoop 等方式详解
  13. 停车场车辆计数案例---以西门子1200PLC演示
  14. 服务器组装风扇,服务器配件之风扇篇
  15. PLC FFT变换 快速傅里叶变换 (含博途PLC完整SCL代码)
  16. 一句“在吗?”逼死人
  17. += *= /= %= 运算的先后顺序
  18. FDTD Script命令学习-farfield3d/farfieldux/farfielduy
  19. [INS-35075] 指定的 SID 已在使用.
  20. mh采样算法推导_基于MH抽样算法的贝叶斯Probit分位回归模型研究

热门文章

  1. 解析解(闭式解)、数值解
  2. # 震惊!软件测试原来是这么回事?!——bilibili
  3. C语言初学之编程思维突破经典
  4. windows系统开机蓝屏出现www.windows.com/stopcode问题处理方法
  5. C语言程序设计入门-萌新篇
  6. vue实现下拉框可以输入又下拉菜单
  7. 数的三次方根 【AcWing】
  8. 安庆师范大学计算机学院官网,安庆师范大学计算机与信息学院导师教师师资介绍简介-吴健...
  9. 服务器3D场景建模(一):PyOpenGL
  10. 【转载】 P2P(打洞)方案 及webrtc实现