二维码加密解密-QRCode
QRCode生成和解析二维码的流程步骤在代码里面方便理解。
加密工具类
/**
* Copyright © 2020wangylCompany. All rights reserved.
*
* @Title: QRCodeUtil.java
* @Prject: MyTestDemo
* @Package: qrcode
* @Description: TODO
* @version: V1.0
*/
package qrcode;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.imageio.ImageIO;
import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
public class QRCodeUtil {
//加密:文字信息----------》二维码
/**
*
* @Title: encoderQRCode
* @Description: TODO
* @param content 二维码的内容
* @param imgPath 二维码的生成路径 src/二维码.png
* @param imgType 二维码的图片格式 png
* @param size 二维码的边长(二维码是正方形,所以只需要边长尺寸即可)
* @return: void 由于二维码生成就是二维码直接输出了,可以不用返回值,或者可以添加boolean返回值
这里暂时不处理异常,主要生成二维码
* @throws IOException
*/
public void encoderQRCode(String content,String imgPath,String imgType,int size) throws IOException{
/**
* API
* 生成图片需要依赖 ImageIO 里面的 write 方法
* ImageIO.write(im, formatName, output)
* im RenderedImage
* formatName 格式名字
* output 文件类型,所以需要与现有文件
*
*
* RenderedImage 是个接口,不能直接new对象,只能通过他的实现类BufferedImage来简历对象
* (ctrl + t 选中RenderedImage,可以看到关系里面有BufferedImage是RenderedImage的一个实现类)
* BufferedImage类型可以代表内存中的一张图片,内存中产生图片以后直接输出到硬盘即可
* 所以现在需要在内存中产生一张图片,由于产生过程相对比较复杂,这里单独创建一个方法qRCodeCommon()来产生img对象
*qRCodeCommon()用来产生图片,返回值必定是BufferedImage类型
*
*/
// RenderedImage
// BufferedImage bufImg = qRCodeCommon(content,imgType,size);//二维码生成版(初始版本)
BufferedImage bufImg = qRCodeCommon2(content,imgType,size);//二维码生成版(加logo)
File file = new File(imgPath);
ImageIO.write(bufImg, imgType, file);
}
/**
*
* @Title: qRCodeCommon
* @Description: TODO 二维码生成版(初始版本)
* @param content 二维码中的隐藏信息类容
* @param imgType 图片的格式 png
* @param size 二维码的尺寸 边长
* @return 返回生成的图片对象
* @return: BufferedImage
* @throws UnsupportedEncodingException
*/
private BufferedImage qRCodeCommon(String content,String imgType,int size) throws UnsupportedEncodingException {
//代码顺序调整前,注释未变化--------------------------------------------
// BufferedImage bufImg =null;
// /**
// * BufferedImage 内存中的图片
// * 正常情况需要对象直接new 就可以,但是bufImg = new BufferedImage()不可以,说明这个class没有无参构造
// * 查看源码,发现没有无参构造但是有有参构造,选择合适的有参构造
// * new BufferedImage(width, height, imageType)
// * width int size
// * height int size
// * imageType int BufferedImage.TYPE_INT_RGB
// *
// * imageType 这里或者直接写1
// * 美术的三原色是 红、黄、蓝 ,计算机的三原色是 red green blue 简称RGB
// *
// *
// */
// bufImg = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
// //有了图片对象后,在通过图片对象生成一个画板
// Graphics2D graphics2d = bufImg.createGraphics();
// //设置画板的背景色设置为白色
// graphics2d.setBackground(Color.WHITE);
// /**
// * graphics2d.clearRect(x, y, width, height);
// * x、y 坐标位置,0,0就是从画板的 左上角 开始
// * width 二维码的边长就是画板的边长
// * height 二维码的边长就是画板的边长
// */
// graphics2d.clearRect(0, 0, size, size);//初始化画板
// /**
// * 画板的背景色设置好了,画板的大小设置好了,现在开始准备画画了(画二维码)
// */
// graphics2d.setColor(Color.BLACK);//设置二维码的颜色:这里设置黑色
// /**
// * 剩下的就是开始话二维码
// * 二维码是如何画的?
// * 这里简述方便理解:
// * helloworld是需要转换成二维码的隐藏信息,这里将helloworld转换成二位码的像素点
// * 这里具体是将helloworld隐藏信息转换成了boolean数组,转换成了boolean[][]二维数组
// * 二维码可以是一个平面,可以看成是一个二维数组,helloworld转换的过程中,对于在映射的过程中,
// * 某一个点如果满足映射标记为黑色,从而整体生成了一个二维码
// */
// /**
// * 这里需要将传进来的字符串转化成一个二位数组boolean[][]
// *
// * 转换成二位数组的话有需要一个Qrcode对象,这里是作为一个处理器
// *
// * qrCodeHandler这里是作为一个处理器
// */
// Qrcode qrCodeHandler = new Qrcode();
// /**
// * 设置二维码的排错率。L/M/Q/H 从小到大
// * L 7%
// * M
// * Q
// * H 30%
// *
// * 排错率越高,二维码可存储的信息越少,但是对二维码清晰度要求越小(容易扫出来)
// *
// * 这里设置一个中间值 M
// */
// qrCodeHandler.setQrcodeErrorCorrect('M');
// /**
// * 二维码可以存放的信息类型 N
// * N 数字(只能放数字)
// * A 数字+A~Z
// * B 所有
// * (一般都选B)
// */
// qrCodeHandler.setQrcodeEncodeMode('B');
// /**
// * 二维码的尺寸
// * 取值范围:1~40 数字越大二维码越大
// * 由于我们制定了二维码的尺寸,但是这里的尺寸只能是1~40,所以超出的话会出错
// * 但是如果真的使用40的话,那二维码又太小了
// * 所以这里为了保证这里满足需求(1~40),又能保证后面的不至于二维码太小,这里自定义一个公式:
// * 在满足qrCodeHandler.setQrcodeVersion(size);的情况下,