496 lines
44 KiB
Java
496 lines
44 KiB
Java
package com.lovenav.utils;
|
||
|
||
import com.alibaba.fastjson.JSON;
|
||
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 com.lovenav.dao.CollectIconListDao;
|
||
import org.springframework.stereotype.Component;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
|
||
import javax.imageio.ImageIO;
|
||
import java.awt.*;
|
||
import java.awt.geom.RoundRectangle2D;
|
||
import java.awt.image.BufferedImage;
|
||
import java.io.*;
|
||
import java.net.HttpURLConnection;
|
||
import java.net.URL;
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.*;
|
||
import java.util.regex.Pattern;
|
||
|
||
@Component
|
||
@Service
|
||
public class QRCodeUtil {
|
||
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;
|
||
|
||
private static BufferedImage createImage(String content, String imgPath,
|
||
boolean needCompress) throws Exception {
|
||
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
|
||
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 (imgPath == null || "".equals(imgPath)) {
|
||
return image;
|
||
}
|
||
// 插入图片
|
||
QRCodeUtil.insertImage(image, imgPath, needCompress);
|
||
return image;
|
||
}
|
||
|
||
/**
|
||
* 插入LOGO
|
||
*
|
||
* @param source
|
||
* 二维码图片
|
||
* @param imgPath
|
||
* LOGO图片地址
|
||
* @param needCompress
|
||
* 是否压缩
|
||
* @throws Exception
|
||
*/
|
||
private static void insertImage(BufferedImage source, String imgPath,
|
||
boolean needCompress) throws Exception {
|
||
File file = new File(imgPath);
|
||
if (!file.exists()) {
|
||
System.err.println(""+imgPath+" 该文件不存在!");
|
||
return;
|
||
}
|
||
Image src = ImageIO.read(new File(imgPath));
|
||
int width = src.getWidth(null);
|
||
int height = src.getHeight(null);
|
||
if (needCompress) { // 压缩LOGO
|
||
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 imgPath
|
||
* LOGO地址
|
||
* @param destPath
|
||
* 存放目录
|
||
* @param needCompress
|
||
* 是否压缩LOGO
|
||
* @throws Exception
|
||
*/
|
||
public static String encode(String content, String imgPath, String destPath,
|
||
boolean needCompress) throws Exception {
|
||
BufferedImage image = QRCodeUtil.createImage(content, imgPath,
|
||
needCompress);
|
||
mkdirs(destPath);
|
||
String file = new Random().nextInt(99999999)+".jpg";
|
||
ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
|
||
return destPath+"/"+file;
|
||
}
|
||
|
||
/**
|
||
* 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
|
||
* @param destPath 存放目录
|
||
*/
|
||
public static void mkdirs(String destPath) {
|
||
File file =new File(destPath);
|
||
//当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
|
||
if (!file.exists() && !file.isDirectory()) {
|
||
file.mkdirs();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 生成二维码(内嵌LOGO)
|
||
*
|
||
* @param content
|
||
* 内容
|
||
* @param imgPath
|
||
* LOGO地址
|
||
* @param destPath
|
||
* 存储地址
|
||
* @throws Exception
|
||
*/
|
||
public static void encode(String content, String imgPath, String destPath)
|
||
throws Exception {
|
||
QRCodeUtil.encode(content, imgPath, destPath, false);
|
||
}
|
||
|
||
/**
|
||
* 生成二维码
|
||
*
|
||
* @param content
|
||
* 内容
|
||
* @param destPath
|
||
* 存储地址
|
||
* @param needCompress
|
||
* 是否压缩LOGO
|
||
* @throws Exception
|
||
*/
|
||
public static void encode(String content, String destPath,
|
||
boolean needCompress) throws Exception {
|
||
QRCodeUtil.encode(content, null, destPath, needCompress);
|
||
}
|
||
|
||
/**
|
||
* 生成二维码
|
||
*
|
||
* @param content
|
||
* 内容
|
||
* @param destPath
|
||
* 存储地址
|
||
* @throws Exception
|
||
*/
|
||
public static void encode(String content, String destPath) throws Exception {
|
||
QRCodeUtil.encode(content, null, destPath, false);
|
||
}
|
||
|
||
/**
|
||
* 生成二维码(内嵌LOGO)
|
||
*
|
||
* @param content
|
||
* 内容
|
||
* @param imgPath
|
||
* LOGO地址
|
||
* @param output
|
||
* 输出流
|
||
* @param needCompress
|
||
* 是否压缩LOGO
|
||
* @throws Exception
|
||
*/
|
||
public static void encode(String content, String imgPath,
|
||
OutputStream output, boolean needCompress) throws Exception {
|
||
BufferedImage image = QRCodeUtil.createImage(content, imgPath,
|
||
needCompress);
|
||
ImageIO.write(image, FORMAT_NAME, output);
|
||
}
|
||
|
||
/**
|
||
* 生成二维码
|
||
*
|
||
* @param content
|
||
* 内容
|
||
* @param output
|
||
* 输出流
|
||
* @throws Exception
|
||
*/
|
||
public static void encode(String content, OutputStream output)
|
||
throws Exception {
|
||
QRCodeUtil.encode(content, null, output, false);
|
||
}
|
||
|
||
/**
|
||
* 解析二维码
|
||
*
|
||
* @param file
|
||
* 二维码图片
|
||
* @return
|
||
* @throws Exception
|
||
*/
|
||
public static String decode(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<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
|
||
hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
|
||
result = new MultiFormatReader().decode(bitmap, hints);
|
||
String resultStr = result.getText();
|
||
return resultStr;
|
||
}
|
||
|
||
/**
|
||
* 解析二维码
|
||
*
|
||
* @param path
|
||
* 二维码图片地址
|
||
* @return
|
||
* @throws Exception
|
||
*/
|
||
public static String decode(String path) throws Exception {
|
||
return QRCodeUtil.decode(new File(path));
|
||
}
|
||
|
||
/**
|
||
*
|
||
* @param content
|
||
* @param imgPath
|
||
* @param destPath
|
||
* @param localUrl 当前环境的域名或者ip地址
|
||
* @param needCompress
|
||
* @return
|
||
* @throws Exception
|
||
*/
|
||
public static String encode(String content, String imgPath, String destPath,String localUrl,
|
||
boolean needCompress) throws Exception {
|
||
BufferedImage image = QRCodeUtil.createImage(content, imgPath,
|
||
needCompress);
|
||
mkdirs(destPath);
|
||
String file = new Random().nextInt(99999999)+".jpg";
|
||
ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
|
||
return localUrl+file;
|
||
}
|
||
|
||
public static String encodeDZ(String content, String imgPath, String destPath,String localUrl,int length,int width,
|
||
boolean needCompress) throws Exception {
|
||
BufferedImage image = QRCodeUtil.createImageDZ(content, imgPath,length,width,
|
||
needCompress);
|
||
mkdirs(destPath);
|
||
String file = new Random().nextInt(99999999)+".jpg";
|
||
ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
|
||
return localUrl+file;
|
||
}
|
||
|
||
private static BufferedImage createImageDZ(String content, String imgPath,int newlength,int newWidth,
|
||
boolean needCompress) throws Exception {
|
||
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
|
||
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, newlength, newWidth, 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 (imgPath == null || "".equals(imgPath)) {
|
||
return image;
|
||
}
|
||
// 插入图片
|
||
QRCodeUtil.insertImage(image, imgPath, needCompress);
|
||
return image;
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 将图片url转换成base64流
|
||
* @param url
|
||
* @return
|
||
*/
|
||
public static String getBase64(String url){
|
||
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
|
||
Map hints = new HashMap();
|
||
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //设置字符集编码类型
|
||
hints.put(EncodeHintType.MARGIN, 1); //设置白边
|
||
BitMatrix bitMatrix = null;
|
||
try {
|
||
bitMatrix = multiFormatWriter.encode(url, BarcodeFormat.QR_CODE, 300, 300,hints);
|
||
BufferedImage image = toBufferedImage(bitMatrix);
|
||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||
//输出二维码图片流
|
||
try {
|
||
ImageIO.write(image, "jpg",outputStream);
|
||
Base64.Encoder encoder = Base64.getEncoder();
|
||
String base =encoder.encodeToString(outputStream.toByteArray());
|
||
return base;
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
} catch (WriterException e1) {
|
||
// TODO Auto-generated catch block
|
||
e1.printStackTrace();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
|
||
public static BufferedImage toBufferedImage(BitMatrix matrix) {
|
||
int width = matrix.getWidth();
|
||
int height = matrix.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, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);//0xFF000000黑;0xFFFFFFFF白
|
||
}
|
||
}
|
||
return image;
|
||
}
|
||
|
||
// 获取本地图片路径,转为base64
|
||
public static String ImageToBase64(String imgPath) {
|
||
byte[] data = null;
|
||
// 读取图片字节数组
|
||
try {
|
||
InputStream in = new FileInputStream(imgPath);
|
||
data = new byte[in.available()];
|
||
in.read(data);
|
||
in.close();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
// 对字节数组Base64编码
|
||
Base64.Encoder encoder = Base64.getEncoder();
|
||
// 返回Base64编码过的字节数组字符串
|
||
// System.out.println("本地图片转换Base64:" + encoder.encodeToString(data));
|
||
return encoder.encodeToString(data);
|
||
}
|
||
|
||
/**
|
||
* 根据图片url下载图片到本地
|
||
*/
|
||
|
||
public static String downloadPicture(String pictureurl) throws Exception {
|
||
//因为是测试,图片url可以随便搞一个,我从百度随便复制了个图片url
|
||
String pictureUrl = pictureurl;
|
||
//建立图片连接
|
||
URL url = new URL(pictureUrl);
|
||
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
|
||
//设置请求方式
|
||
connection.setRequestMethod("GET");
|
||
//设置超时时间
|
||
connection.setConnectTimeout(10*1000);
|
||
|
||
//输入流
|
||
InputStream stream = connection.getInputStream();
|
||
int len = 0;
|
||
byte[] test = new byte[1024];
|
||
|
||
|
||
//获取项目路径
|
||
File directory = new File("src/main/resources/static/icon");
|
||
String paths = directory.getCanonicalPath();
|
||
//如果没有文件夹则创建
|
||
File file = new File("src/main/resources/static/icon");
|
||
if (!file.exists()){
|
||
file.mkdirs();
|
||
}
|
||
|
||
//设置图片名称,这个随意
|
||
String date = new Random().nextInt(99999999)+".jpg";
|
||
String fileName = date ;
|
||
|
||
//输出流,图片输出的目的文件
|
||
String serverPath = "src/main/resources/static/icon";
|
||
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(serverPath +"/" + fileName));
|
||
|
||
//以流的方式上传
|
||
while ((len =stream.read(test)) !=-1){
|
||
fos.write(test,0,len);
|
||
}
|
||
|
||
|
||
//记得关闭流,不然消耗资源
|
||
stream.close();
|
||
fos.close();
|
||
return (serverPath +"/" + fileName);
|
||
}
|
||
|
||
|
||
|
||
// 对字节数组字符串进行Base64解码并生成图片
|
||
//imgFilePath 待保存的本地路径
|
||
public static String GenerateImage(String base64Str, String imgFilePath) throws IOException {
|
||
if (base64Str == null) // 图像数据为空
|
||
return null;
|
||
Base64.Decoder decoder = Base64.getDecoder();
|
||
|
||
// Base64解码
|
||
byte[] bytes = decoder.decode(base64Str);
|
||
for (int i = 0; i < bytes.length; ++i) {
|
||
if (bytes[i] < 0) {// 调整异常数据
|
||
bytes[i] += 256;
|
||
}
|
||
}
|
||
//设置图片名称,这个随意
|
||
String date = new Random().nextInt(99999999)+".jpg";
|
||
String fileName = date ;
|
||
|
||
// 生成jpg图片
|
||
OutputStream out = new FileOutputStream(imgFilePath +"/" + fileName);
|
||
out.write(bytes);
|
||
out.flush();
|
||
out.close();
|
||
return (imgFilePath +"/" + fileName);
|
||
}
|
||
|
||
public static boolean notBase64(String url){
|
||
String reg = "[a-zA-z]+://[^\\s]*";
|
||
boolean isMatch = Pattern.matches(reg, url);
|
||
if(isMatch){
|
||
return isMatch;
|
||
}
|
||
return isMatch;
|
||
}
|
||
|
||
public static String delete_profix(String base64){
|
||
String delete = "data:image/jpg;base64,";
|
||
String Base64 = base64;
|
||
return(base64.replace(delete,""));
|
||
}
|
||
|
||
|
||
public static void main(String[] args) throws Exception {
|
||
|
||
String base64 = "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";
|
||
GenerateImage(base64, "src/main/resources/static/icon");
|
||
|
||
// String text = "https://www.baidu.com"; //这里设置自定义网站url
|
||
// String logoPath ="src/main/resources/static/logo/NAV.png";
|
||
// String destPath = "src/main/resources/static/qr";
|
||
// String url = QRCodeUtil.encode(text, logoPath, destPath, true);
|
||
// System.out.println(url);
|
||
// String base64 = getBase64(url);
|
||
// System.out.println(base64);
|
||
|
||
/* String file="D:\\11.jpg";
|
||
String info=QRCodeUtil.decode(file);
|
||
System.out.println(info);*/
|
||
}
|
||
} |