依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
代码
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
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 {
// 基于图片路径
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;
}
// 基于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;
}
// 调整图片对比度(提高偏暗环境下二维码识别成功率)
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;
}
}
}