java+zxing生成带logo的二维码

java+zxing生成带logo的二维码

观前提示:

本文所使用的IDEA版本为ultimate 2019.1,JDK版本为1.8.0_141。

本文所用的是zxing包生成的二维码,为Maven管理的java项目,直接上代码。

pom.xml 引用部分代码

<dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>core</artifactId>
      <version>3.4.0</version>
    </dependency>

    <dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>javase</artifactId>
      <version>3.4.0</version>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>

工具类 QRCodeUtil.java

package generateQRCode;

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 org.apache.commons.lang3.StringUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Hashtable;

/**
 * @description 二维码工具类
 * @create 2019-12-18 by jjy
 */
public class QRCodeUtil {

    private static String CHARACTER = "UTF-8";
    private static String IMAGE_FORMAT = "JPG";
    private static int QRCODE_SIZE = 300;//二维码尺寸
    private static int BLACK = 0xFF000000;//黑色,二维码黑色方块代表1
    private static int WHITE = 0xFFFFFFFF;//白色,二维码白色色方块代表0
    private static int LOGO_SIZE = 60;//logo尺寸

    /**
     * @description 生成二维码
     * @param content
     * @param logoPath
     * @return
     * @throws Exception
     * @create 2019-12-18 by jjy
     */
    private static BufferedImage generateQRCode(String content, String logoPath) throws Exception{

        Hashtable ht = new Hashtable();
        // 设置二维码纠错等级,L(7%)、M(15%)、Q(25%)、H(30%),纠错等级可存储的信息越少,但对二维码清晰度的要求越小
        ht.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        //设置UTF-8字符编码集
        ht.put(EncodeHintType.CHARACTER_SET, CHARACTER);
        //设置图片边距
        ht.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, ht);

        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        //使用BufferedImage生成二维码图片
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for(int x = 0; x < width; x ++){
            for (int y = 0; y < height; y++){
                bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }

        //判断是否有logo,没有logo直接生成二维码
        if(StringUtils.isBlank(logoPath)){
            return bufferedImage;
        }

        //插入logo
        insertLogo(bufferedImage, logoPath);
        return bufferedImage;
    }

    /**
     * @description 插入logo
     * @param bufferedImage
     * @param logoPath
     * @throws Exception
     * @create 2019-12-18 by jjy
     */
     private static void insertLogo(BufferedImage bufferedImage, String logoPath) throws Exception{

        File file = new File(logoPath);
        if(!file.exists()){
            System.out.println("logo图片不存在,路径为:" + logoPath);
            return;
        }

        Image logoImage = ImageIO.read(file);
        //插入logo
         Graphics2D graphics2D = bufferedImage.createGraphics();
         int x = (QRCODE_SIZE - LOGO_SIZE)/ 2;
         int y = (QRCODE_SIZE - LOGO_SIZE)/ 2;
         graphics2D.drawImage(logoImage, x, y,LOGO_SIZE, LOGO_SIZE, null);
         Shape shape = new RoundRectangle2D.Float(x, y, LOGO_SIZE, LOGO_SIZE, 6, 6);
         graphics2D.setStroke(new BasicStroke(3f));
         graphics2D.draw(shape);
         graphics2D.dispose();
     }

    /**
     * @description 生成二维码并保存图片
     * @param content
     * @param logoPath
     * @param outPath
     * @throws Exception
     * @create 2019-12-18 by jjy
     */
     public static void encode(String content, String logoPath, String outPath) throws Exception {
        BufferedImage bufferedImage = generateQRCode(content, logoPath);
        File file = new File(outPath);
        if(!file.exists()){
            file.mkdirs();
        }
        String QRCodeName = System.currentTimeMillis() + ".jpg";
        ImageIO.write(bufferedImage, IMAGE_FORMAT, new File(outPath + File.separator + QRCodeName));
     }

    /**
     * @description 解析二维码内容
     * @param QRCodePath
     * @return
     * @throws Exception
     * @create 2019-12-18 by jjy
     */
     public static String decode(String QRCodePath) throws Exception {
         File file = new File(QRCodePath);
         if(!file.exists()){
             System.out.println("二维码路径不正确,路径为:" + QRCodePath);
             return null;
         }
         BufferedImage bufferedImage = ImageIO.read(file);
         BufferedImageLuminanceSource bufferedImageLuminanceSource = new BufferedImageLuminanceSource(bufferedImage);
         BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(bufferedImageLuminanceSource));
         Hashtable hint = new Hashtable();
         hint.put(DecodeHintType.CHARACTER_SET, CHARACTER);
         Result result = new MultiFormatReader().decode(binaryBitmap, hint);
         return result.getText();
     }
}

测试类 Test.java

package generateQRCode;

public class Test {
    public static void main(String[] args) throws Exception{
        String content = "https://blog.csdn.net/weixin_43611145";
        String logoPath = "C:\\Users\\jjy\\Desktop\\微信图片_20191218094620.jpg";
        String outPath = "D:/QRCode";
        QRCodeUtil.encode(content, logoPath, outPath);

        String QRCodePath = "D:\\QRCode\\1.jpg";
        System.out.println(QRCodeUtil.decode(QRCodePath));
    }
}

运行结果如下
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值