java生成二维码以及链接邀请

 			
<img src="/cn-user/inviter-code-image.html?width=130&inviterCode=<s:property value="inviterURL"/>">
         

导包:

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

使用教程:

    public String inviterCodeImage() {
        try {
            if (width <= 0) {
                width = 200;
            }
            var response = ServletActionContext.getResponse();
            ///cn-user/inviter-code-image.html?width=130&inviterCode=https://www.medchemexpress.cn/integral-invitation-code-form.html?inviter-code=847231841027573182527186725995
            //inviterCode为二维码扫描内容 width为宽度
            byte[] bs = ImageUtils.createQRCodeImage(inviterCode, width);
            response.setHeader("Cache-Control", "no-store");
            response.setContentType("image/png");
            response.setContentLength(bs.length);
            response.getOutputStream().write(bs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

工具类:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class ImageUtils {
    public static final String FORMAT_JPG = "jpg";
    public static final String FORMAT_PDF = "pdf";
    public static final String FORMAT_PNG = "png";
    public static final String FORMAT_GIF = "gif";
    public static final String FORMAT_BMP = "bmp";

    private ImageUtils() {
    }

    /**
     * 图片压缩
     * @param maxWidth
     * @param maxHeight
     * @param bytes
     * @return
     */
    public static byte[] thumbnail(int maxWidth, int maxHeight, byte[] bytes) {
        var imageBuffer = new ByteArrayInputStream(bytes);
        BufferedImage srcImage;
        try {
            srcImage = ImageIO.read(imageBuffer);
        } catch (Exception ignore) {
            return null; // impossible
        }
        int srcWidth = srcImage.getWidth();
        int srcHeight = srcImage.getHeight();
        int thumbnailWidth = maxWidth;
        int thumbnailHeight = maxHeight;
        if (srcWidth >= srcHeight) {
            thumbnailHeight = thumbnailWidth * srcHeight / srcWidth;
        } else {
            thumbnailWidth = thumbnailHeight * srcWidth / srcHeight;
        }
        var thumbnailImage = new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB);
        var thumbnailGraphics = thumbnailImage.createGraphics();
        try {
            var scaledImage = srcImage.getScaledInstance(thumbnailWidth, thumbnailHeight, Image.SCALE_SMOOTH);
            thumbnailGraphics.drawImage(scaledImage, 0, 0, thumbnailWidth, thumbnailHeight, null);
        } finally {
            thumbnailGraphics.dispose();
        }
        try (var outBuffer = new ByteArrayOutputStream()) {
            ImageIO.write(thumbnailImage, "png", outBuffer);
            return outBuffer.toByteArray();
        } catch (Exception ignore) {
            return null; // impossible
        }
    }

    /**
     * 获取图片后缀
     * @param bytes
     * @param defaultFormat
     * @return
     */
    public static String getImageFormatName(byte[] bytes, String defaultFormat) {
        try {
            var imageStream = ImageIO.createImageInputStream(new ByteArrayInputStream(bytes));
            var readerIterator = ImageIO.getImageReaders(imageStream);
            if (readerIterator.hasNext()) {
                var reader = readerIterator.next();
                var format = reader.getFormatName().toLowerCase();
                // 文件格式名参考 PNGImageReaderSpi,大体可用,只是 JPG 搞特殊,额外处理一下
                if ("jpeg".equals(format)) {
                    format = FORMAT_JPG;
                }
                return format;
            }
        } catch (Exception ignore) {
        }
        return defaultFormat;
    }

    /**
     * 创建二维码图片
     * @param text
     * @param width
     * @return
     */
    public static byte[] createQRCodeImage(String text, int width) {
        var hints = new HashMap<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        hints.put(EncodeHintType.MARGIN, 0);
        return createQRCodeImage(text, width, hints);
    }

    /**
     * 创建二维码图片
     * @param text
     * @param width
     * @param 二维码图片微调参数
     * @return
     */
    public static byte[] createQRCodeImage(String text, int width, Map<EncodeHintType, Object> hints) {
        try {
            var writer = new QRCodeWriter();
            @SuppressWarnings("SuspiciousNameCombination")
            var matrix = writer.encode(text, BarcodeFormat.QR_CODE, width, width, hints);
            var buffer = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(matrix, "PNG", buffer);
            return buffer.toByteArray();
        } catch (Exception e) {
            log.error("create qrcode image", e);
            return new byte[0];
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值