当前位置: 首页 > news >正文

windows网站建设教程谷歌官网

windows网站建设教程,谷歌官网,建设官方网站怎么登录,国外校园网站建设前言:在日常的开发工作当中可能需要实现一个二维码小功能,我参考了网上很多关于SpringBoot生成二维码的教程,最终还是自己封装了一套完整生成二维码的工具类,可以支持基础的黑白二维码、带颜色的二维码、带Logo的二维码、带颜色和…

前言:在日常的开发工作当中可能需要实现一个二维码小功能,我参考了网上很多关于SpringBoot生成二维码的教程,最终还是自己封装了一套完整生成二维码的工具类,可以支持基础的黑白二维码、带颜色的二维码、带Logo的二维码、带颜色和Logo的二维码和解析二维码五大功能,还可以生成具体的二维码文件或返回Base64,都是博主自己手写封装好的,这边免费开源给大家一键使用!只求大家一个免费的三连支持!

目录

一、问题记录

二、导入pom依赖

三、QRCodeUtil工具类完整代码

四、使用示例

五、Gitee源码

六、总结


一、问题记录

这边我使用的是zxing提供的jar包生成的二维码,不过有1个问题博客目前暂时未解决,如果有解决的方法希望可以在评论区交流一下,问题如下:

二维码的内容如果设置为中文,会报com.google.zxing.NotFoundException的错误,这个问题博主搜索了网上很多的信息也没有找到具体的解决方案。

二、导入pom依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 二维码生成器依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version></dependency><!-- 常用工具类 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

三、QRCodeUtil工具类完整代码

package com.example.ewm.utils;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.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Random;
import javax.imageio.ImageIO;import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;/*** @author HTT*/
@Component
public class QRCodeUtil {/*** 编码格式*/private static final String CHARSET = "utf-8";/*** 二维码后缀名*/private static final String FORMAT_NAME = "JPG";/*** 二维码尺寸*/private static final int QRCODE_SIZE = 300;/*** 插入图宽度*/private static final int WIDTH = 60;/*** 插入图高度*/private static final int HEIGHT = 60;/*** 插入图片* @param source 文件流* @param imgPath 图片路径* @param needCompress 是否压缩图片* @throws Exception*/private void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {throw new Exception(imgPath+"图片文件不存在");}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();}/*** 创建带图片的二维码核心方法(如果图片路径为空,不会生成图片)* @param content 二维码内容* @param imgPath 图片路径* @param needCompress 是否压缩图片* @return* @throws Exception*/private BufferedImage createEwm(String content, String imgPath, boolean needCompress) throws Exception {Hashtable hints = new Hashtable(16);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 (StringUtils.isEmpty(imgPath)) {return image;}// 插入图片insertImage(image, imgPath, needCompress);return image;}/*** 创建自定义颜色和图片的二维码核心方法(如果图片路径为空,不会生成图片)* @param content 二维码内容* @param imgPath 图片路径* @param needCompress 是否压缩图片* @param frontColor 前景色* @param backgroundColor 背景色* @return* @throws Exception*/private BufferedImage createEwm(String content, String imgPath, boolean needCompress,int frontColor,int backgroundColor) throws Exception {Hashtable hints = new Hashtable(16);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) ? frontColor : backgroundColor);}}if (StringUtils.isEmpty(imgPath)) {return image;}// 插入图片insertImage(image, imgPath, needCompress);return image;}/*** 生成带图片的二维码保存为文件(如果图片路径为空,不会生成图片)* @param content 二维码内容* @param imgPath 图片路径* @param destPath 存放路径* @param needCompress 是否压缩图片* @throws Exception*/private void generate(String content, String imgPath, String destPath, boolean needCompress) throws Exception {BufferedImage image = createEwm(content, imgPath, needCompress);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}/*** 创建自定义颜色和图片的二维码保存为文件(如果图片路径为空,不会生成图片)* @param content 二维码内容* @param imgPath 图片路径(路径为空,则只生成基础的二维码)* @param destPath 存放路径* @param needCompress 是否压缩图片* @param frontColor 前景色* @param backgroundColor 背景色* 例举一些16进制的颜色代码* 0x000000 黑* 0xff0000 亮红* 0x00ff00 亮绿* 0xffff00 亮黄* 0x0000ff 亮蓝* 0xff00ff 亮紫* 0x00ffff 亮浅蓝* 0xffffff 白* 0xc6c6c6 亮灰* 0x848484 暗灰* @throws Exception*/private void generate(String content, String imgPath, String destPath, boolean needCompress,int frontColor,int backgroundColor) throws Exception {BufferedImage image = createEwm(content, imgPath, needCompress,frontColor,backgroundColor);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}/*** 生成带有图片的二维码并返回Base64(如果图片路径为空,不会生成图片)* @param content 二维码内容* @param imgPath 图片路径* @param needCompress 是否压缩图片* @return* @throws Exception*/private String generateBase64(String content, String imgPath, boolean needCompress) throws Exception {if (!StringUtils.isEmpty(content)) {HashMap<EncodeHintType, Comparable> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.MARGIN, 0);BufferedImage bufferedImage = createEwm(content, imgPath, needCompress);ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bufferedImage, FORMAT_NAME, os);String base64 = Base64.encode(os.toByteArray());os.flush();os.close();return "data:image/png;base64," + base64;}return "";}/*** 生成带有自定义颜色和图片的二维码并返回Base64(如果图片路径为空,不会生成图片)* @param content 二维码内容* @param imgPath 图片路径* @param needCompress 是否压缩图片* @param frontColor 前景色* @param backgroundColor 背景色* @return* @throws Exception*/private String generateBase64(String content, String imgPath, boolean needCompress,int frontColor,int backgroundColor) throws Exception {if (!StringUtils.isEmpty(content)) {HashMap<EncodeHintType, Comparable> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.MARGIN, 0);BufferedImage bufferedImage = createEwm(content, imgPath, needCompress,frontColor,backgroundColor);ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bufferedImage, FORMAT_NAME, os);String base64 = Base64.encode(os.toByteArray());os.flush();os.close();return "data:image/png;base64," + base64;}return "";}/*** 创建多级目录* @param destPath*/private void mkdirs(String destPath) {File file = new File(destPath);if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}/*** 根据文件解析二维码* @param file* @return* @throws Exception*/private String analysis(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));HashMap hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);Result result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}/*******************************************************以下是创建二维码提供的方法封装*******************************************************//******************************另存为文件版本******************************//*** 创建基础的二维码* @param content 二维码内容* @param destPath 存放路径* @throws Exception*/public void create(String content, String destPath) throws Exception {generate(content, null, destPath, false);}/*** 创建带颜色基础的二维码* @param content 二维码内容* @param destPath 存放路径* @throws Exception*/public void create(String content, String destPath,int frontColor,int backgroundColor) throws Exception {generate(content, null, destPath, false,frontColor,backgroundColor);}/*** 创建带图片的二维码* @param content 二维码内容* @param imgPath 图片路径* @param destPath 存放路径* @param needCompress 是否压缩图片* @throws Exception*/public void create(String content, String imgPath, String destPath,boolean needCompress) throws Exception {generate(content, imgPath, destPath, needCompress);}/*** 创建带有自定义颜色和图片的二维码* @param content 二维码内容* @param imgPath 图片路径* @param destPath 存放路径* @param needCompress 是否压缩图片* @param frontColor 前景色* @param backgroundColor 背景色* @throws Exception*/public void create(String content, String imgPath, String destPath,boolean needCompress,int frontColor,int backgroundColor) throws Exception {generate(content, imgPath, destPath, needCompress,frontColor,backgroundColor);}/******************************另存为文件版本******************************//******************************Base64版本******************************//*** 创建基础的二维码并返回Base64* @param content* @throws Exception*/public String create(String content) throws Exception {return generateBase64(content,null,false);}/*** 创建带颜色基础的二维码并返回Base64* @param content* @throws Exception*/public String create(String content,int frontColor,int backgroundColor) throws Exception {return generateBase64(content,null,false,frontColor,backgroundColor);}/*** 创建带图片的二维码并返回Base64* @param content 二维码内容* @param imgPath 图片路径* @param needCompress 是否压缩图片* @throws Exception*/public String create(String content, String imgPath,boolean needCompress) throws Exception {return generateBase64(content, imgPath, needCompress);}/*** 创建带有自定义颜色和图片的二维码并返回Base64* @param content 二维码内容* @param imgPath 图片路径* @param needCompress 是否压缩图片* @param frontColor 前景色* @param backgroundColor 背景色* @throws Exception*/public String create(String content, String imgPath,boolean needCompress,int frontColor,int backgroundColor) throws Exception {return generateBase64(content, imgPath, needCompress,frontColor,backgroundColor);}/******************************Base64版本******************************//*** 根据文件路径解析二维码* @param path 文件路径* @return* @throws Exception*/public String decode(String path) throws Exception {File file = new File(path);if(!file.exists()){throw new Exception("文件不存在!");}return analysis(file);}}

四、使用示例

友情提醒:代码中的布尔值是代表Logo图片是否需要被压缩,如果是true说明嵌入的Logo图片需要被压缩,我的建议是默认为true,因为如果不压缩,在使用decode解析带Logo的二维码的时候会报com.google.zxing.NotFoundException的错误,博主亲自测试过。

单元测试:

@SpringBootTest
class EwmApplicationTests {@Resourceprivate QRCodeUtil qrCodeUtil;@Testvoid contextLoads() throws Exception {qrCodeUtil.create("httstudy","F:\\基础二维码.jpg");qrCodeUtil.create("httstudy","F:\\带颜色的二维码.jpg",0xff0000,0xffff00);qrCodeUtil.create("httstudy","F:\\Logo.png","F:\\带logo的二维码.jpg",true);qrCodeUtil.create("httstudy","F:\\Logo.png","F:\\带颜色和logo的二维码.jpg",true,0xff0000,0xffff00);String str = qrCodeUtil.create("httstudy");String str2 = qrCodeUtil.create("httstudy",0xff0000,0xffff00);String str3 = qrCodeUtil.create("httstudy","F:\\Logo.png",true);String str4 = qrCodeUtil.create("httstudy","F:\\Logo.png",true,0xff0000,0xffff00);System.out.println(str);System.out.println(str2);System.out.println(str3);System.out.println(str4);String result = qrCodeUtil.decode("F:\\基础二维码.jpg");String result2 = qrCodeUtil.decode("F:\\带颜色的二维码.jpg");String result3 = qrCodeUtil.decode("F:\\带logo的二维码.jpg");String result4 = qrCodeUtil.decode("F:\\带颜色和logo的二维码.jpg");System.out.println(result);System.out.println(result2);System.out.println(result3);System.out.println(result4);}}

 运行结果:

五、Gitee源码

码云地址:SpringBoot生成二维码完整工具类分享

六、总结

良心博主原创封装不易,把常见场景需要用到的二维码类型都给大家封装好了,只要像单元测试那样一键生成就好了,如有问题,欢迎评论区留言!

http://www.mmbaike.com/news/31365.html

相关文章:

  • 晚上做羞羞的事情视频网站seo外链建设方法
  • 做网站 给图片加链接搜狗搜索引擎优化
  • 360建设网站免费百度客服中心
  • 网站开发与实践题库网站功能开发
  • 福州官网网站建设网络营销服务策略
  • 微信网站设计seo点击排名软件哪里好
  • 网站一般用什么架构佛山网络推广培训
  • 产看网站权重软文素材库
  • 高质量外链网站广州网站优化公司如何
  • 顶呱呱做网站吗色盲测试图第六版
  • 给孩子做衣服的网站seo关键词优化软件
  • 广州品牌设计公司整站优化深圳
  • 河南住房建设部网站windows优化大师会员
  • 淘客做网站多少钱最新注册域名查询
  • 兼职制作网站开发人教版优化设计电子书
  • 做58同城这样的网站有哪些拉新推广渠道
  • 建立官网需要多少钱seo搜索优化是什么呢
  • 中国工业品网站长工具seo综合查询官网
  • 上海专业网站建设案例网络营销的主要内容包括
  • 帝国怎么做网站线上销售怎么做推广
  • 新手做网站流程今日军事新闻最新消息中国
  • 网站开发的技术可行性怎么写泉州seo按天计费
  • 北京市建设工程招投标关键词排名优化软件策略
  • 建材 东莞网站建设市场调研报告范文
  • 新建网站二级网页怎么做网络平台的推广方法
  • 网站备案和域名备案手机金融界网站
  • 重庆做网站费用seo技巧是什么
  • 个人电脑安装win2003做网站网站点击量统计
  • 用asp做的网站有哪些成人英语培训班哪个机构好
  • 外贸独立网站seo网站维护费用一般多少钱