package qrcode;
import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* QRCode 日本
* 需要jar包:QRCode.jar
*/
public class QRCodeUtil {
/**
*
* @param content 内容
* @param imgPath 图片输出路径
* @param imgType 文件类型
* @param size 图片大小
* @throws IOException
*/
public void encoderQRCode(String content,String imgPath,String imgType,int size) throws IOException {
BufferedImage code = createImg(content, size);
File file = new File(imgPath);
//生成图片
ImageIO.write(code,imgType,file);
}
/**
* 生成二维码(加密):文字 -> 二维码
* @param content 内容
* @param size QrcodeVersion
*/
public BufferedImage createImg(String content,int size) throws IOException {
//二维码处理类,将内容映射成二维数组 字符串->boolean[][]
Qrcode qrcode = new Qrcode();
//设置二维码排错率:7% L<M<Q<H 30% .排错率越高,存放的信息越少,对二维码清晰度要求也越小
qrcode.setQrcodeErrorCorrect('M');
//设置存放的信息类型:N:数字 A:数字+A-Z B:所有
qrcode.setQrcodeEncodeMode('B');
//设置尺寸,取值范围为 1-40
qrcode.setQrcodeVersion(size);
//将内容映射成二维数组
boolean[][] contentBytes = qrcode.calQrcode(content.getBytes());
//计算图片大小推荐公式
int imgSize = 67+12*(size-1);
System.out.println("imgSize = " + imgSize);
//生成内存中的图片
//BufferedImage.TYPE_INT_RGB :图片产生的颜色(绘图基础颜色)
BufferedImage bufferedImage = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB);
//创建画板
Graphics2D gs = bufferedImage.createGraphics();
//设置画板背景颜色
gs.setBackground(Color.white);
//初始化白色画板
gs.clearRect(0,0,imgSize,imgSize);
//设置画板上图像的颜色
gs.setColor(Color.black);
//设置偏移大小
int pixoff = 2;
for (int i = 0;i<contentBytes.length;i++){
for(int j=0;j<contentBytes.length;j++){
if(contentBytes[i][j]){
//画黑格。设置格子大小,高度和宽度都为3.
gs.fillRect(i*3+pixoff,j*3+pixoff,3,3);
}
}
}
//增加logo,其实就是再画一张图,覆盖在上面
//将硬盘中的src/logo.png
BufferedImage logo = ImageIO.read(new File("E:\\temp\\previewFix.jpg"));
//设置logo大小和所处位置
int height =bufferedImage.getHeight();
System.out.println("height = " + height);
int width = bufferedImage.getWidth();
System.out.println("width = " + width);
gs.drawImage(logo,width*2/5,height*2/5,width/5,height/5,null);
//释放空间
gs.dispose();
//清理缓冲区
bufferedImage.flush();
return bufferedImage;
}
//解密
public String decoderQRCode(String imgpath) throws IOException {
//将硬盘的二维码读为内存中的二维码
BufferedImage image = ImageIO.read(new File(imgpath));
//创建解密对象
QRCodeDecoder decoder = new QRCodeDecoder();
byte[] bytes = decoder.decode(new TwoDimensionCodeImage(image));
String res = new String(bytes,"UTF-8");
return res;
}
public static void main(String[] args) throws IOException {
String imgPath = "E:\\temp\\二维码.png";
String content = "http://www.baidu.com";
QRCodeUtil qrCodeUtil = new QRCodeUtil();
qrCodeUtil.encoderQRCode(content,imgPath,"png",17);
String res = qrCodeUtil.decoderQRCode(imgPath);
System.out.println("res = " + res);
}
}
class TwoDimensionCodeImage implements QRCodeImage{
BufferedImage bufImg; //将图片加载到内存中
public TwoDimensionCodeImage(BufferedImage bufImg) {
this.bufImg = bufImg;
}
@Override
public int getWidth() {
return bufImg.getWidth();
}
@Override
public int getHeight() {
return bufImg.getHeight();
}
@Override
public int getPixel(int x, int y) {
return bufImg.getRGB(x,y);
}
}
二维码QRCode
最新推荐文章于 2022-03-18 17:36:37 发布