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 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 hints = new HashMap(); //设置编码格式 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 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 hints = new HashMap(); //设置编码格式 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; } } }