JAVA根据URL、跳转链接,生成二维码,海报二维码

1、导入ZXing包

1.1什么是ZXing

ZXing是一个开源的类库,是用Java编写的多格式的1D / 2D条码图像处理库,使用ZXing可以生成、识别QR Code(二维码)。常用的二维码处理库还有zbar,近几年已经不再更新代码,下边介绍ZXing生成二维码的方法。

1.2打开对应的对应pom文件把下面的坐标地址复制进去

引入依赖

        <!-- 添加ZXing依赖 -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version>
        </dependency>

2、创建生成二维码、海报二维码的工具类

创建二维码功能使用较多,我们一般把它生成为工具类放在公共模块中,方便其他模块进行调用。

2.1说明

        2.1.1二维码在海报中的位置调整、如果只生成二维码请略过

        //二维码在海报中的X坐标
        int qrCodeX = 183;     该参数是调整二维码在海报中的左右位置
        // 二维码在海报中的Y坐标
        int qrCodeY = 533;     该参数是调整二维码在海报中的上下位置

        2.1.2返回值说明

        生成海报二维码的方法的返回值为Base64,如想返回二进制或其他请自己修改代码即可

        生成普通二维码的方法的返回值为二进制图片,如想返回Base64,拿到二进制数据,在调用转Base64数据的方法即可

        2.1.3二维码的白边宽度调整

        调整二维码四周白边的宽度的方法:

         在下面代码中的getDecodeHintTyp()方法中如下:

        // 设置边距为1
        hints.put(EncodeHintType.MARGIN, 0);

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Base64;

public class QRCodeUtil {

    /*
     * 获取海报二维码图片调用getPostQrCode(),默认返回Base64格式
     * 只根据跳转链接生成二维码调用getQrCodeImag(),如果需要转换为base64拿到返回值后调用convertImageToBase64()
     */

    public static void main(String[] args) throws WriterException {
        // 海报图片链接
        String posterImageLink = "海报二维码图片链接";
        // 二维码链接
        String qrCodeLink = "扫码生成的二维码之后的跳转地址";
        // 二维码宽度
        int qrCodeWidth = 190;
        // 二维码高度
        int qrCodeHeight = 190;
        // 二维码在海报中的X坐标
        int qrCodeX = 183;
        // 二维码在海报中的Y坐标
        int qrCodeY = 533;

        BufferedImage qrCodeImage = getQrCodeImage(qrCodeLink, qrCodeWidth, qrCodeHeight);
        String base64QrCode = convertImageToBase64(qrCodeImage);
        System.out.println(base64QrCode);
    }

    /**
     * 获取海报二维码图片
     * @param posterImageLink 海报图片链接
     * @param qrCodeLink 二维码跳转链接
     * @param qrCodeWidth 二维码宽度
     * @param qrCodeHeight 二维码高度
     * @param qrCodeX 二维码在海报中的X坐标
     * @param qrCodeY 二维码在海报中的Y坐标
     * @return 海报二维码图片Base64字符串
     */
    public static String getPostQrCode(String posterImageLink, String qrCodeLink, int qrCodeWidth, int qrCodeHeight, int qrCodeX, int qrCodeY) {
        try {
            // 下载海报图片
            URL posterURL = new URL(posterImageLink);
            BufferedImage posterImage = ImageIO.read(posterURL);
            // 将海报图片转换为RGB色彩模式
            posterImage = convertToRGB(posterImage);

            BufferedImage qrCodeImage = getQrCodeImage(qrCodeLink, qrCodeWidth, qrCodeHeight);

            // 将二维码嵌入到海报中
            Graphics2D graphics = posterImage.createGraphics();
            graphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);
            graphics.dispose();

            // 将海报转换为Base64格式
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(posterImage, "jpg", outputStream);
            byte[] posterData = outputStream.toByteArray();
            String base64Poster = Base64.getEncoder().encodeToString(posterData);

            // 添加Base64前缀
            base64Poster = "data:image/jpeg;base64," + base64Poster;

            // 输出Base64格式的海报图片
            return base64Poster;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据跳转链接获取二维码图片
     * @param qrCodeLink 二维码跳转链接
     * @param qrCodeWidth 二维码宽度
     * @param qrCodeHeight 二维码高度
     * @return 二维码图片
     */
    public static BufferedImage getQrCodeImage(String qrCodeLink, int qrCodeWidth, int qrCodeHeight) throws WriterException {
        // 生成二维码
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        // 设置二维码参数
        BitMatrix bitMatrix = multiFormatWriter.encode(qrCodeLink, BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeHeight,
                getDecodeHintType());
        BufferedImage qrCodeImage = toBufferedImage(bitMatrix);
        // 将二维码图片转换为RGB色彩模式
        qrCodeImage = convertToRGB(qrCodeImage);
        return qrCodeImage;
    }

    // 获取二维码的编码参数
    private static java.util.Map<EncodeHintType, Object> getDecodeHintType() {
        java.util.Map<EncodeHintType, Object> hints = new java.util.HashMap<>();
        // 设置字符集
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置容错级别为高
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 设置边距为1
        hints.put(EncodeHintType.MARGIN, 0);
        return hints;
    }

    // 将BitMatrix转换为BufferedImage
    private 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) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
            }
        }
        return image;
    }

    // 将图片转换为RGB色彩模式
    private static BufferedImage convertToRGB(BufferedImage image) {
        BufferedImage rgbImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = rgbImage.createGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return rgbImage;
    }


    /**
     * 将图片转换为Base64字符串
     * @param image BufferedImage
     * @return Base64字符串
     */
    public static String convertImageToBase64(BufferedImage image){
        try {
            // 1. 将BufferedImage写入ByteArrayOutputStream
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos); // 可以选择其他格式,如"jpg"
            byte[] imageBytes = baos.toByteArray();
            // 2. 将字节数组编码为Base64字符串
            return "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值