package com.ltkj.web.controller.barcode;
|
|
import cn.hutool.extra.qrcode.BufferedImageLuminanceSource;
|
import com.google.zxing.*;
|
import com.google.zxing.common.HybridBinarizer;
|
|
import javax.imageio.ImageIO;
|
import java.awt.*;
|
import java.awt.image.BufferedImage;
|
import java.io.File;
|
import java.io.IOException;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
|
public class QRCodeUtils {
|
|
/**
|
* @Description: 基于图片路径
|
*/
|
public static String deEncodeByPath(String path) {
|
String content = null;
|
BufferedImage image;
|
try {
|
image = ImageIO.read(new File(path));
|
//调整图片对比度(提高偏暗环境下二维码识别成功率)
|
image = imgColorContrast(image, 100);
|
LuminanceSource source = new BufferedImageLuminanceSource(image);
|
Binarizer binarizer = new HybridBinarizer(source);
|
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
|
Map<DecodeHintType, Object> hints = new HashMap<>();
|
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
|
Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码
|
content = result.getText();
|
} catch (NotFoundException e) {
|
//这里判断如果识别不了带LOGO的图片,重新添加上一个属性
|
try {
|
image = ImageIO.read(new File(path));
|
image = imgColorContrast(image, 100);
|
LuminanceSource source = new BufferedImageLuminanceSource(image);
|
Binarizer binarizer = new HybridBinarizer(source);
|
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
|
Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
|
//设置编码格式
|
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
|
//设置优化精度
|
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
|
//设置复杂模式开启(使用这种方式就可以识别微信的二维码了)
|
hints.put(DecodeHintType.PURE_BARCODE,Boolean.TYPE);
|
Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码
|
content = result.getText();
|
} catch (NotFoundException en) {
|
return null;
|
} catch (IOException e1) {
|
return null;
|
}
|
} catch (IOException e) {
|
return null;
|
}
|
return content;
|
}
|
|
/**
|
* @Description: 基于BufferedImage
|
*/
|
public static String deEncodeByBufferedImage(BufferedImage image) {
|
String content = null;
|
try {
|
image = imgColorContrast(image, 100);
|
LuminanceSource source = new BufferedImageLuminanceSource(image);
|
Binarizer binarizer = new HybridBinarizer(source);
|
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
|
Map<DecodeHintType, Object> hints = new HashMap<>();
|
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
|
Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码
|
content = result.getText();
|
} catch (NotFoundException e) {
|
//这里判断如果识别不了带LOGO的图片,重新添加上一个属性
|
try {
|
image = imgColorContrast(image, 100);
|
LuminanceSource source = new BufferedImageLuminanceSource(image);
|
Binarizer binarizer = new HybridBinarizer(source);
|
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
|
Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
|
//设置编码格式
|
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
|
//设置优化精度
|
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
|
//设置复杂模式开启(这种方式就可以识别微信的二维码了)
|
hints.put(DecodeHintType.PURE_BARCODE,Boolean.TYPE);
|
Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码;
|
content = result.getText();
|
} catch (NotFoundException en) {
|
return null;
|
}
|
}
|
return content;
|
}
|
|
/**
|
* @Description: 调整图片对比度(提高偏暗环境下二维码识别成功率)
|
*/
|
public static BufferedImage imgColorContrast(BufferedImage imgsrc, int contrast) {
|
try {
|
int contrast_average = 128;
|
//创建一个不带透明度的图片
|
BufferedImage back=new BufferedImage(imgsrc.getWidth(), imgsrc.getHeight(),BufferedImage.TYPE_INT_RGB);
|
int width = imgsrc.getWidth();
|
int height = imgsrc.getHeight();
|
int pix;
|
for (int i = 0; i < height; i++) {
|
for (int j = 0; j < width; j++) {
|
int pixel = imgsrc.getRGB(j, i);
|
Color color = new Color(pixel);
|
|
if (color.getRed() < contrast_average)
|
{
|
pix = color.getRed()- Math.abs(contrast);
|
if (pix < 0) {
|
pix = 0;
|
}
|
}
|
else
|
{
|
pix = color.getRed() + Math.abs(contrast);
|
if (pix > 255) {pix = 255;}
|
}
|
int red= pix;
|
if (color.getGreen() < contrast_average)
|
{
|
pix = color.getGreen()- Math.abs(contrast);
|
if (pix < 0) {pix = 0;}
|
}
|
else
|
{
|
pix = color.getGreen() + Math.abs(contrast);
|
if (pix > 255) {pix = 255;}
|
}
|
int green= pix;
|
if (color.getBlue() < contrast_average)
|
{
|
pix = color.getBlue()- Math.abs(contrast);
|
if (pix < 0) {pix = 0;}
|
}
|
else
|
{
|
pix = color.getBlue() + Math.abs(contrast);
|
if (pix > 255) pix = 255;
|
}
|
int blue= pix;
|
|
color = new Color(red,green,blue);
|
int x=color.getRGB();
|
back.setRGB(j,i,x);
|
}
|
}
|
return back;
|
} catch (Exception e) {
|
e.printStackTrace();
|
return null;
|
}
|
}
|
|
|
|
|
}
|