JAVA生成二维码,并且在二维码底部加了字

<!-- 二维码jar包google.zxing -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>
/**
 * 生成二维码
 */
public class QRCodeUtils {
    private static final String CHARSET = "utf-8";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 335;
    // 用二维码生成新图片,新图片加高多少,比如加的字体大小为24,这里就设置成26
    private static final int FONT_SIZE_HEIGHT = 26;
    // 用二维码生成新图片,宽度
    private static final int BUFFEREDIMAGE_SIZE_WIDTH = QRCODE_SIZE;
    // 用二维码生成新图片,高度
    private static final int BUFFEREDIMAGE_SIZE_HEIGHT = QRCODE_SIZE + FONT_SIZE_HEIGHT;

    /**
     * 二维码生成BASE64,返给前端
     *
     * @param code 二维码图值信息
     * @return
     * @throws Exception
     */
    public static String getQRCode(String code) throws Exception {
        String text = null;
        ByteArrayOutputStream outputStream = null;
        ByteArrayOutputStream outputStream2 = null;
        try {
            if (StringUtils.isEmpty(code)) {
                throw new Exception("二维码值为空");
            }

            Hashtable<EncodeHintType, Object> hints = new Hashtable<>(16);
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix bitMatrix = new MultiFormatWriter().encode(code,
                    BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);

            outputStream = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
            //以下部分是给二维码加文字,不加可以不用写
            //将b作为输入流;
            ByteArrayInputStream in = new ByteArrayInputStream(outputStream.toByteArray());
            //将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();
            BufferedImage image = ImageIO.read(in);
            BufferedImage bufferedImage = addNote(image,new String(("NO. " + code).getBytes("UTF-8"),"UTF-8"));
            outputStream2 = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage,"PNG",outputStream2);
            //以上部分是给二维码加文字,不加可以不用写,不写时将outputStream2改成outputStream
            Base64.Encoder encoder = Base64.getEncoder();
            text = encoder.encodeToString(outputStream2.toByteArray());
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
            if (outputStream2 != null) {
                outputStream2.close();
            }
        }
        return "data:image/png;base64," + text;
    }

    /**
     * 给二维码下方添加说明文字
     * @param image 原二维码
     * @param note 说明文字
     * @return 带说明文字的二维码
     */
    public static BufferedImage addNote(BufferedImage image,String note){
        Image src = image.getScaledInstance(QRCODE_SIZE, QRCODE_SIZE,Image.SCALE_DEFAULT);
        BufferedImage tag;
        if (note.length()<=24){
            //生成新图片的大小
            tag = new BufferedImage(BUFFEREDIMAGE_SIZE_WIDTH, BUFFEREDIMAGE_SIZE_HEIGHT,BufferedImage.TYPE_INT_RGB);
        }else{
            //这句代码还没调试过,这里表示文字需要折行
            tag = new BufferedImage(300, 345,BufferedImage.TYPE_INT_RGB);
        }
        //设置低栏白边
        Graphics g1 = tag.getGraphics();
        //设置文字
        Graphics2D g2 = tag.createGraphics();
        Font font = new Font("微软雅黑",Font.BOLD,24);
        g2.setFont(font);
        g2.setColor(Color.BLACK);
        if (note.length()<=24) {
            //下面这个26要和tag = new BufferedImage(330, 356,BufferedImage.TYPE_INT_RGB);356-330=26对上
            g1.fillRect(0, QRCODE_SIZE, QRCODE_SIZE, FONT_SIZE_HEIGHT);
            //文字在图片上的位置
            g2.drawString(note,/*QRCODE_SIZE/2-note.length()*8-14*/20, QRCODE_SIZE+font.getSize());
        }else{
            //这里的代码还没测试过
            g1.fillRect(0, QRCODE_SIZE, QRCODE_SIZE, 45);
            //下面两次表示文件需要换行显示
            g2.drawString(note.substring(0, 24),5, QRCODE_SIZE+font.getSize());
            g2.drawString(note.substring(24,note.length()), QRCODE_SIZE/2-(note.length()-24)*8-14, QRCODE_SIZE+font.getSize()*2+4);
        }
        g1.drawImage(src, 0, 0, null);
        g1.dispose();
        g2.dispose();
        image = tag;
        image.flush();
        return image;
    }
    
    public static void main(String[] args) throws Exception {
        //下面是生成文件
       /* String text = "http://www.baidu.com";  //这里设置自定义网站url
        String logoPath = "C:\\Users\\admin\\Desktop\\test\\test.jpg";
        String destPath = "C:\\Users\\admin\\Desktop\\test\\";
        System.out.println(QRCodeUtils.encode(text, logoPath, destPath, true));*/
       //下面是生成base64
        System.out.println(getQRCode("112233hhhh"));
        /*File qrcFile = new File("E:/img/","tupian.png");
        pressText("谷歌", qrcFile, 5, Color.RED, 32);*/
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界的老菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值