Zxing中怎么生成二维码并返回
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章给大家介绍Zxing中怎么生成二维码并返回,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。引入 Google Zxing jar包 com.google.zxing
千家信息网最后更新 2025年02月23日Zxing中怎么生成二维码并返回
这篇文章给大家介绍Zxing中怎么生成二维码并返回,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
引入 Google Zxing jar包
com.google.zxing core 3.4.0 com.google.zxing javase 3.4.0
工具类
package com.sunlands.feo.school.candlestick.utils;import com.google.zxing.*;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.springframework.stereotype.Component;import javax.imageio.ImageIO;import java.awt.*;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.OutputStream;import java.util.Hashtable;/** * @author dongxie */@Componentpublic class QrCodeUtils { 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; /** * 创建二维码图片 * * @param content 内容 * @param logoPath logo * @param isCompress 是否压缩Logo * @return 返回二维码图片 * @throws WriterException e * @throws IOException BufferedImage */ public static BufferedImage createImage(String content, String logoPath, boolean isCompress) throws WriterException, IOException { Hashtablehints = 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 (logoPath == null || "".equals(logoPath)) { return image; } // 插入图片 QrCodeUtils.insertImage(image, logoPath, isCompress); return image; } /** * 添加Logo * * @param source 二维码图片 * @param logoPath Logo * @param isCompress 是否压缩Logo * @throws IOException void */ private static void insertImage(BufferedImage source, String logoPath, boolean isCompress) throws IOException { File file = new File(logoPath); if (!file.exists()) { return; } Image src = ImageIO.read(new File(logoPath)); int width = src.getWidth(null); int height = src.getHeight(null); // 压缩LOGO if (isCompress) { 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; } // 插入LOGO Graphics2D 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(); } /** * 生成带Logo的二维码 * * @param content 二维码内容 * @param logoPath Logo * @param destPath 二维码输出路径 * @param isCompress 是否压缩Logo * @throws Exception void */ public static void create(String content, String logoPath, String destPath, boolean isCompress) throws Exception { BufferedImage image = QrCodeUtils.createImage(content, logoPath, isCompress); mkdirs(destPath); ImageIO.write(image, FORMAT_NAME, new File(destPath)); } /** * 生成不带Logo的二维码 * * @param content 二维码内容 * @param destPath 二维码输出路径 */ public static void create(String content, String destPath) throws Exception { QrCodeUtils.create(content, null, destPath, false); } /** * 生成带Logo的二维码,并输出到指定的输出流 * * @param content 二维码内容 * @param logoPath Logo * @param output 输出流 * @param isCompress 是否压缩Logo */ public static void create(String content, String logoPath, OutputStream output, boolean isCompress) throws Exception { BufferedImage image = QrCodeUtils.createImage(content, logoPath, isCompress); ImageIO.write(image, FORMAT_NAME, output); } /** * 生成不带Logo的二维码,并输出到指定的输出流 * * @param content 二维码内容 * @param output 输出流 * @throws Exception void */ public static void create(String content, OutputStream output) throws Exception { QrCodeUtils.create(content, null, output, false); } /** * 二维码解析 * * @param file 二维码 * @return 返回解析得到的二维码内容 * @throws Exception String */ public static String parse(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); return result.getText(); } /** * 二维码解析 * * @param path 二维码存储位置 * @return 返回解析得到的二维码内容 * @throws Exception String */ public static String parse(String path) throws Exception { return QrCodeUtils.parse(new File(path)); } /** * 判断路径是否存在,如果不存在则创建 * * @param dir 目录 */ public static void mkdirs(String dir) { if (dir != null && !"".equals(dir)) { File file = new File(dir); if (!file.isDirectory()) { file.mkdirs(); } } }}
使用
package com.jiafly.blueberry.controller;import com.jiafly.blueberry.common.utils.QrCodeUtils;import org.apache.tomcat.util.http.fileupload.IOUtils;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.OutputStream;/** * 二维码 * * @author dongxie */@RestController@RequestMapping(path = "/qrcode")public class QrCodeController { @GetMapping(path = "/create") public void image(HttpServletResponse response, @RequestParam("content") String content) { try { BufferedImage bufferedImage = QrCodeUtils.createImage(content, null, false); responseImage(response, bufferedImage); } catch (Exception e) { // 异常自行处理,应用程序切忌直接打印堆栈日志,难定位 e.printStackTrace(); } } /** * 设置 可通过postman 或者浏览器直接浏览 * * @param response response * @param bufferedImage bufferedImage * @throws Exception e */ public void responseImage(HttpServletResponse response, BufferedImage bufferedImage) throws Exception { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ImageOutputStream imageOutput = ImageIO.createImageOutputStream(byteArrayOutputStream); ImageIO.write(bufferedImage, "jpeg", imageOutput); InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); OutputStream outputStream = response.getOutputStream(); response.setContentType("image/jpeg"); response.setCharacterEncoding("UTF-8"); IOUtils.copy(inputStream, outputStream); outputStream.flush(); }}
关于Zxing中怎么生成二维码并返回就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
二维
二维码
内容
输出
生成
路径
图片
更多
UTF-8
帮助
浏览
不错
位置
兴趣
堆栈
宽度
小伙
小伙伴
尺寸
工具
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全通报体系建设
东营量化积分管理软件开发软件
大学法制主题教育基地软件开发
连云港在线联想服务器厂家直供
传奇服务器最低配置
网络技术开发计算机软件开发
长春市公安局 网络安全支队
WITS数据库产品层面关税
网络安全大潮
增城区无源网络技术开发工艺
wind数据库系数
淮安营销软件开发项目
数据库进程用户
数据库地址如何恢复
服务器被流量攻击一般多久
医院网络安全设计目的
NDS服务器的作用
工行软件开发中心杭州工会
电脑服务器启动脚本
武汉环宇互联网科技公司
延庆区正规软件开发专业服务
市南区苹果软件开发服务公司
ftp服务器配置与分析
行业软件开发培训机构
微信公众号配置服务器
网络安全认证资质证明
欧比特网络安全
办公数据库处理软件有哪些
大智慧数据库要钱吗
还原网络出现无法连接服务器