二维码(带Logo)加密解密-ZXing方式
ZXing生成和解析二维码的流程步骤在代码的注解里面。
二维码的加密解密工具类
/**
* Copyright © 2020wangylCompany. All rights reserved.
*
* @Title: ZXingUtil.java
* @Prject: MyTestDemo
* @Package: zxing
* @Description: TODO
* @version: V1.0
*/
package zxing;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.oned.MultiFormatUPCEANReader;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import jp.sourceforge.qrcode.util.Color;
/**
* @ClassName: ZXingUtil
* @Description: TODO
*
*
*/
public class ZXingUtil {
//二维码加密:文字--->二维码(无logo)
public static void encodeImg(String imgPath,String format,String content,int width, int height) throws WriterException, IOException{
/**
* 需要二维码图片,就需要生成图片
* 生成图片就需要用到ImageIO.write(im, formatName, output)
* 实际编写代码的时候一般是是倒着分析,由于生成图片使用的是
* ImageIO.write(im, formatName, output)
* 那么剩下的就是将里面的参数补齐就可以了
* im RenderedImage
* formatName 格式名字
* output 文件类型,所以需要与现有文件
*
* 先对文件的格式进行分析,output是文件类型,整个我们可以通过将二维码文件路径作为参数传递过来获取生成文件
* public void encodeImt(String imgPath)
* String imgPath----->file
* File file = new File(imgPath);
*
* ImageIO.write(, , file)
*
* 图片的格式formatName,二维码的图片格式,整个可以通过传参的方式传递进来
* encodeImt(String imgPath,String format)
* ImageIO.write(, format, file)
*
*
* im RenderedImage内存中的一张图片
* 由于RenderedImage是一个接口类型不能直接用不能直接生成RenderedImage对象
* 需要使用RenderedImage的子类辅助,选中RenderedImage 然后ctrl+t查看子类
* 可以找到RenderedImage的子类有BufferedImage
* 所以这里我们可以产生一个RenderedImage对象,所以这里剩下的就是如何产生BufferedImage对象
*
* BufferedImage img = new BufferedImage(width, height, imageType);
*
* BufferedImage(width, height, imageType);
*
* 二维码生成进一步分析:
* 由于二维码生成目前需要的是一个内存中图片对象BufferedImage,然后将内存中的二维码输出到硬盘即可
* 但是内存中中的二维码又是如何生成的?
* 二维码生成是将出传递进来的加密字符串转换成一个boolean[][],然后通过对二位数组循环遍历判断,
* 并对true进行着色标记生成成图片。
* (字符串转换二维数组后,字符串中的某一个字符对应二位数组的某一个点后,就标记为true)
* 那么这里整个boolean值怎么拿,如何判断二维数组中的某一个点是true还是false
* 这里需要一个工具类BitMatrix,这个里面包含了一个boolean[][]
*
* 二维码生成的核心就是产生一个二维数组,产生二维数组需要BitMatrix,因为里面包含了一个二维数组
*
* 那么BitMatrix怎么产生呢?
* new MultiFormatWriter().encode(contents, format, width, height)
* 这个可以产生图片需要的BitMatrix对象
* 产生BitMatrix需要将new MultiFormatWriter().encode(, , , )里面的参数补齐
* new MultiFormatWriter().encode(, , , )目的是将文本变成二维数组
* contents 加密的字符串,可以作为参数传进来
* new MultiFormatWriter().encode(content, , , )
* format 解密的类型(条形码、二维码.....) 这个类型和二维码图片类型需要区别开来,不是同一个
* new MultiFormatWriter().encode(contents,BarcodeFormat.QR_CODE , , )
* BarcodeFormat.QR_CODE指的就是二维码
*
* width/height 这个宽高不太重要可以通过调用时候传参写固定
* new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
* 这样这个BitMatrix对象就产生了
*
* 但是这里还有一个五个参数的也可以产生BitMatrix对象
* new MultiFormatWriter().encode(contents, format, width, height, hints)
* hints Map<EncodeHintType, ?> hints;
* 所以这里需要一个Map类型对象,但是这个Map是interface Map<K,V>,由于是一个接口,所以需要使用实现类创建对象
* 这里使用Hashtable<K, V>
* K:EncodeHintType
* V:? 这里?代表的是任意类型,所以使用Object
* Hashtable<EncodeHintType, Object>
*
* 至于为什么需要这个map,暂时不用管,因为这个代码需要,先提供这个对象先
* Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
*
* 那么这个具体作用做什么的?
* 这个可以用来粗放一些参数值:编码格式、排错率。。。(用来存放加关于加密的参数)
* hints:加密涉及的参数
* 编码格式:
* 排错率:
* 外边距:
*
* BitMatrix bitMatrix =new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
* 这样就可以产生一个BitMatrix对象了,然后就可以开始生成内存中的二维码
* BufferedImage img = new BufferedImage(width, height,imgType);
* imgType 图片类型 BufferedImage.TYPE_INT_RGB
* 画BufferedImage需要用到BitMatrix,现在BitMatrix已经有了,可以开始画图
* 由于BitMatrix里面包含了一个二维数组,所需需要将二位数组整出来
*
*
*/
//生成二维码文件对象
//File file = new File(imgPath);
/**
* 内存中的一张图片,
* 此时需要的图片是二维码---(产生的前提)--->boolean[][]--(产生的需要)------>BitMatrix
*/
//产生图片需要的BitMatrix对象是需要用到的
/**
* hints:加密涉及的参数
*/
Hashtable