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;
    }

}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码来生成二维码海报: ```java import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.QRCodeWriter; public class QRCodeGenerator { public static void main(String[] args) { String qrCodeText = "https://www.example.com"; // 二维码包含的文本信息 String filePath = "qr_code.png"; // 生成的二维码图片保存的文件路径 int size = 300; // 二维码图片的大小 try { // 创建QRCodeWriter对象 QRCodeWriter qrCodeWriter = new QRCodeWriter(); // 创建BitMatrix对象,表示二维码的矩阵 BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeText, BarcodeFormat.QR_CODE, size, size); // 创建BufferedImage对象,表示二维码图片 BufferedImage bufferedImage = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB); bufferedImage.createGraphics(); // 设置二维码图片的背景颜色和前景颜色 Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics(); graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, size, size); graphics.setColor(Color.BLACK); // 绘制二维码图片 for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (bitMatrix.get(i, j)) { graphics.fillRect(i, j, 1, 1); } } } // 保存二维码图片到文件 ImageIO.write(bufferedImage, "png", new File(filePath)); System.out.println("二维码海报已生成并保存到文件:" + filePath); } catch (Exception e) { System.out.println("生成二维码海报时出现错误:" + e.getMessage()); } } } ``` 这段代码使用了 Google 的 ZXing 库来生成二维码。您需要在代码中设置二维码包含的文本信息、生成的二维码图片保存的文件路径以及二维码图片的大小。然后,该代码将会生成一个黑白的二维码海报,并保存到指定的文件路径中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值