目录

【复制即用】实现通过扫描生成的二维码跳转到指定网页,也可实现扫描二维码显示文本或图片

1.0.导入依赖坐标

1.1.工具类

1.2.入参类

1.3.controller层

1.4.service层

1.5.业务逻辑处理层

1.6 测试示例

【复制即用】实现通过扫描生成的二维码跳转到指定网页,也可实现扫描二维码显示文本或图片

1.0.导入依赖坐标

<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version>
</dependency>

1.1.1导入谷歌提供的帮助类(前置)

import com.google.zxing.LuminanceSource;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;/*** 二维码生成解析帮助(二维码图片缓存)类** @Author 周兆宇* @Date 2022-01-21 14:17:01*/
public class BufferedImageLuminanceSource extends LuminanceSource {private final BufferedImage image;private final int left;private final int top;public BufferedImageLuminanceSource(BufferedImage image) {this(image, 0, 0, image.getWidth(), image.getHeight());}public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {super(width, height);int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();if (left + width > sourceWidth || top + height > sourceHeight) {throw new IllegalArgumentException("Crop rectangle does not fit within image data.");}for (int y = top; y < top + height; y++) {for (int x = left; x < left + width; x++) {if ((image.getRGB(x, y) & 0xFF000000) == 0) {// = whiteimage.setRGB(x, y, 0xFFFFFFFF);}}}this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);this.image.getGraphics().drawImage(image, 0, 0, null);this.left = left;this.top = top;}@Overridepublic byte[] getRow(int y, byte[] row) {if (y < 0 || y >= getHeight()) {throw new IllegalArgumentException("Requested row is outside the image: " + y);}int width = getWidth();if (row == null || row.length < width) {row = new byte[width];}image.getRaster().getDataElements(left, top + y, width, 1, row);return row;}@Overridepublic byte[] getMatrix() {int width = getWidth();int height = getHeight();int area = width * height;byte[] matrix = new byte[area];image.getRaster().getDataElements(left, top, width, height, matrix);return matrix;}@Overridepublic boolean isCropSupported() {return true;}@Overridepublic LuminanceSource crop(int left, int top, int width, int height) {return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);}@Overridepublic boolean isRotateSupported() {return true;}@Overridepublic LuminanceSource rotateCounterClockwise() {int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);Graphics2D g = rotatedImage.createGraphics();g.drawImage(image, transform, null);g.dispose();int width = getWidth();return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);}}

1.1.工具类

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.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import javax.imageio.ImageIO;/*** 二维码生成解析工具类** @Author 周兆宇* @Date 2022-01-21 14:17:01*/
public class QrCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// 二维码尺寸private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 60;// LOGO高度private static final int HEIGHT = 60;private static BufferedImage createImage(String content, 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();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, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插入图片QrCodeUtil.insertImage(image, imgPath, needCompress);return image;}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);// 压缩LOGOif (needCompress) {if (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();}public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {BufferedImage image = QrCodeUtil.createImage(content, imgPath, needCompress);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {BufferedImage image = QrCodeUtil.createImage(content, imgPath, needCompress);return image;}public static void mkdirs(String destPath) {File file = new File(destPath);// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath) throws Exception {QrCodeUtil.encode(content, imgPath, destPath, false);}public static void encode(String content, String destPath) throws Exception {QrCodeUtil.encode(content, null, destPath, false);}public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)throws Exception {BufferedImage image = QrCodeUtil.createImage(content, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output) throws Exception {QrCodeUtil.encode(content, null, output, false);}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;}public static String decode(String path) throws Exception {return QrCodeUtil.decode(new File(path));}}

1.2.入参类

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @Description: 生成二维码入参类* @Author: 周兆宇* @Date: 2022-01-24 16:57:08*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@ApiModel("生成二维码入参类")
public class QrCodeReq implements Serializable {private static final long serialVersionUID = -3535741618235811221L;@ApiModelProperty("存放在二维码中的内容(全地址路径)")private String text;@ApiModelProperty("生成的二维码的路径及名称")private String destPath;
}

1.3.controller层

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Description: 二维码生成解析控制层* @Author: 周兆宇* @Date: 2022-01-24 17:01:22*/
@RestController
@Slf4j
@Api(tags = "二维码生成解析API")
@RequestMapping("/qrCode")
public class QrCodeController {@Resourceprivate QrCodeFacade qrCodeService;@ApiOperation(value = "二维码生成与解析")@PostMapping("/buildQrCode")public Result buildQrCode(@RequestBody QrCodeReq qrCodeReq) {return qrCodeService.buildQrCode(qrCodeReq);}}

1.4.service层

/*** @Description: 二维码生成解析服务接口* @Author: 周兆宇* @Date: 2022-01-24 17:04:14*/
public interface QrCodeFacade {/*** 功能描述: 二维码生成并解析** @param qrCodeReq* @return com.dianliantech.common.model.Result* @author 周兆宇* @date 2022-01-24 17:12:44*/Result buildQrCode(QrCodeReq qrCodeReq);
}

1.5.业务逻辑处理层

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;/*** @Description: 二维码生成解析逻辑处理层* @Author: 周兆宇* @Date: 2022-01-24 17:34:05*/
@Component
@Slf4j
public class QrCommand {/*** 功能描述: 生成和解析二维码** @param qrCodeReq* @return Result* @author 周兆宇* @date 2022-01-24 17:42:24*/public Result buildQrCode(QrCodeReq qrCodeReq) {try {// 生成二维码        二维码内容    嵌入二维码的图片路径;  图片存储路径;    是否将嵌入二维码的图片进行压缩QrCodeUtil.encode(qrCodeReq.getText(), null, qrCodeReq.getDestPath(),false);// 解析二维码(传入要解析的二维码地址即可)QrCodeUtil.decode(qrCodeReq.getDestPath());// 返回二维码存放路径return Result.succeed(qrCodeReq.getDestPath());} catch (Exception e) {return Result.failed(e.toString());}}
}

1.6 测试示例


public class QrCodeTest {public static void main(String[] args) throws Exception {// 存放在二维码中的内容String text = "文本内容/需要扫描后跳转的全路径地址";// 嵌入二维码的图片路径String imgPath = "D:/qrCode/1.jpg";// 生成的二维码的路径及名称String destPath = "D:/qrCode/qrcode/test.jpg";//生成二维码QRCodeUtil.encode(text, imgPath, destPath, true);// 解析二维码String str = QRCodeUtil.decode(destPath);// 打印出解析出的内容System.out.println(str);  //: 文本内容/路径地址}}

【java实现二维码的生成(源码)】相关推荐

  1. 好用的在线二维码生成器网站PHP源码

    简介: 上传源码以后了,打开域名即可使用,源码仅供参考学习,严禁商业用途! 网盘下载地址: http://kekewangLuo.cc/ECmOiWH9R7z0 图片:

  2. 二维弹性波FWI源码和可执行程序

    无奈此platform涨分太快,贴[链接]自行下载吧! 链--接:https://pan.baidu.com/s/17tMagM8byhXPlMJbmeJLkA  提--取--码:jv15 订正: 由 ...

  3. 全新二改广告横幅在线生成源码 无数据库

    介绍: 主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候, 记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是有后台的但是不带数据库的, 账号密码和内容信 ...

  4. Pytorch二维卷积 conv2d 使用/源码/手写实现conv2d/手写向量内积实现conv2d/转置卷积实现——学习笔记

    这里是一份学习笔记- 学习视频点这里

  5. Java实现二维码生成

    title: Java实现二维码生成 categories: "Java" 前言 日前生活上存在很多扫描二维码的场景,支付.加好友-等操作都需要扫描二维码,然后我就在想Java能不 ...

  6. 用java实现表白二维码(附源码)

    用java实现表白二维码(附源码) 以下源码可以实现生成一个表白二维码,扫描二维码就能看到二维码里蕴藏的信息. import com.google.zxing.BarcodeFormat;import ...

  7. java实现二维码生成的几个方法

    java实现二维码生成的几个方法 分类: J2EE2013-06-13 20:32 10390人阅读 评论(1) 收藏 举报 1: 使用SwetakeQRCode在Java项目中生成二维码  http ...

  8. Java实现二维码生成与识别

    java实现QRCODE二维码的编码与解码实例 众所周知,爪哇,是一种神奇的编程语言,用JAVA 实现某一个功能,只是随便上网找一些对应的实现JAR包即可,于是,有了像JAR114这样专门提供给 爪哇 ...

  9. Java实现二维码技术探讨。

    Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码  http://swetake.com/qr/ 下载地址  或着http://sourceforge.j ...

最新文章

  1. python json解析列表显示_求教一下 python 读取 json 以后,输出的问题(unicode 和中文显示)...
  2. mysql 8.0创建远程连接用户
  3. 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」
  4. 成功解决Future Warning: The sklearn.neighbors.dist_metrics module is deprecated in version 0.22 and wil
  5. IE6下绝对定位的高度自适应
  6. SimpleJdbcInsert 和SimpleJdbcCall
  7. java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...
  8. Android软件开发-ProgressBar
  9. matlab用Java绘图_Java中使用MATLAB作图
  10. apache+php环境配置
  11. Papers Read for FAULT REPARE_codestorm_新浪博客
  12. Android手机开发常用数据库,android开发常用的数据库
  13. 回首过去展望未来——14年年终总结
  14. html5 css背景图片满,css background-size与背景图片填满div
  15. ASEMI整流桥GBU808参数,GBU808介绍,GBU808详解
  16. 小议sns与web game
  17. 【Win10错误】从0x80190001错误码恢复
  18. Linux 下 nc 命令介绍
  19. android 益智烧脑游戏,史上最烧脑游戏
  20. Maven学习(一) -- 安装Maven及Eclipse中配置Maven(转自--江湖小妞)

热门文章

  1. python soup中文歌词_Python调用BeautifuSoup进行html的文本内容提取问题 [ 求问吃鸡主播beautifu1 boy...
  2. 大整数的乘法、加法、减法
  3. c语言乘积imnl,2017年计算机二级C语言考前必做试题及答案2
  4. 在线时间戳计算时间差
  5. 千里挑一!玻色量子获金鸡湖创业大赛人工智能赛道冠军
  6. Scratch中的变量
  7. 数据治理系列(三):主数据管理
  8. [js操作(转)]在IE下js操作本地文件相关方法
  9. https证书服务器怎么完成部署?
  10. docker 安装redmine