Zxing中怎么生成二维码并返回
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章给大家介绍Zxing中怎么生成二维码并返回,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。引入 Google Zxing jar包 com.google.zxing
千家信息网最后更新 2025年01月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安全错误
数据库的锁怎样保障安全
物流管理系统软件开发需求
网络安全手机信息防备常识
服务器同步不了怎么办
怎么改变数据库的属性名
软件开发前端和后端哪个麻烦
重庆壹证通网络技术有限公司
公安局网络安全预案
网络安全文字图案
武汉黄陂网络安全员工资情况
国内有名的软件开发
三级考数据库还是网络技术
图们网络安全宣传活动
minecraft野猪服务器
小米手机8刷机软件开发版
专科论文可以进数据库吗
厦门携艇网络技术
用网络技术专业表白
网络安全宣传周教育资料
lgt用什么软件开发
程序没有数据库会怎样
网络安全项目经理日常工作
英雄联盟未开启服务器
苏州智能化联想服务器维修电话
数据库大批量查询崩溃
cad软件开发项目
手游服务器爆满
软件开发文档完整范例
概要设计包括数据库设计
大学计算机建立数据库表
平板网页打不开找不到服务器