使用Qrcode画二维码

不带logo的二维码

package com.itheima.itheima11;

import com.itheima.itheima01.Person;
import com.swetake.util.Qrcode;

import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 任王胡
 * 2023-11-05 13:39
 */
public class Test {
    public static void main(String[] args) throws Exception{
        Qrcode qrcode=new Qrcode();
        // 纠错级别,L<M<Q<H 级别越高,存的纠错信息越多,存的有用信息就越少,图片越清晰
        qrcode.setQrcodeErrorCorrect('M');
        // 编码模式,B 表示可以存任何东西
        qrcode.setQrcodeEncodeMode('B');
        // 版本号,范围1-40,数字越大,二维码就越大
        qrcode.setQrcodeVersion(7);

        // 二维码里面存放的内容
        String content="test qrcode";
        // 获取内容的字节数组,设置编码格式
        byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
        boolean[][] booleans = qrcode.calQrcode(contentBytes);

        // 这样设置可以让二维码占满图片,公式:67+12*(版本号-1)
        int imageSize=67+12*(7-1);
        BufferedImage image=new BufferedImage(imageSize,imageSize,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = image.createGraphics();
        // 设置背景色
        graphics2D.setBackground(Color.WHITE);
        // 清空原始内容
        graphics2D.clearRect(0,0,imageSize,imageSize);
        // 设定图像颜色
        graphics2D.setColor(Color.BLACK);

        // 偏移量,不设置可能导致二维码生产错误
        int pixoff=2;
        int qrcedeSize=3;
        for (int i = 0; i < booleans.length; i++) {
            for (int j = 0; j < booleans.length; j++) {
                // 如果当前位置有像素点
                if ((booleans[i][j])) {
                    // 参数依次是要画的方块的x坐标,y坐标,宽,高
                    graphics2D.fillRect(i*qrcedeSize+pixoff,j*qrcedeSize+pixoff,
                            qrcedeSize,qrcedeSize);
                }
            }
        }

        // 生成logo
        // Image image1=ImageIO.read(new File("D:\\desktop\\橙色头像.png"));
        // 139为二维码图片的宽度,40为logo图片的宽度
        // graphics2D.drawImage(image1,(139-40)/2,(139-40)/2,40,40,null);
        // 收起画板
        graphics2D.dispose();
        image.flush();

        File file=new File("D:\\desktop\\testQrcode.jpg");
        ImageIO.write(image,"jpg",file);
    }
}

生成的二维码

带logo的二维码

package com.itheima.itheima11;

import com.itheima.itheima01.Person;
import com.swetake.util.Qrcode;

import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 任王胡
 * 2023-11-05 13:39
 */
public class Test {
    public static void main(String[] args) throws Exception{
        Qrcode qrcode=new Qrcode();
        // 纠错级别,L<M<Q<H 级别越高,存的纠错信息越多,存的有用信息就越少,图片越清晰
        qrcode.setQrcodeErrorCorrect('M');
        // 编码模式,B 表示可以存任何东西
        qrcode.setQrcodeEncodeMode('B');
        // 版本号,范围1-40,数字越大,二维码就越大
        qrcode.setQrcodeVersion(7);

        // 二维码里面存放的内容
        String content="test qrcode";
        // 获取内容的字节数组,设置编码格式
        byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
        boolean[][] booleans = qrcode.calQrcode(contentBytes);

        // 这样设置可以让二维码占满图片,公式:67+12*(版本号-1)
        int imageSize=67+12*(7-1);
        BufferedImage image=new BufferedImage(imageSize,imageSize,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = image.createGraphics();
        // 设置背景色
        graphics2D.setBackground(Color.WHITE);
        // 清空原始内容
        graphics2D.clearRect(0,0,imageSize,imageSize);
        // 设定图像颜色
        graphics2D.setColor(Color.BLACK);

        // 偏移量,不设置可能导致二维码生产错误
        int pixoff=2;
        int qrcedeSize=3;
        for (int i = 0; i < booleans.length; i++) {
            for (int j = 0; j < booleans.length; j++) {
                // 如果当前位置有像素点
                if ((booleans[i][j])) {
                    // 参数依次是要画的方块的x坐标,y坐标,宽,高
                    graphics2D.fillRect(i*qrcedeSize+pixoff,j*qrcedeSize+pixoff,
                            qrcedeSize,qrcedeSize);
                }
            }
        }

        // 生成logo
        Image image1=ImageIO.read(new File("D:\\desktop\\橙色头像.png"));
        // 139为二维码图片的宽度,40为logo图片的宽度
        graphics2D.drawImage(image1,(139-40)/2,(139-40)/2,40,40,null);
        // 收起画板
        graphics2D.dispose();
        image.flush();

        File file=new File("D:\\desktop\\testQrcode.jpg");
        ImageIO.write(image,"jpg",file);
    }
}

生成的二维码

上面画的二维码尺寸都是139*139像素的,看起来有点糊

可以画一个分辨率比之前更大的,图片更清晰的二维码,代码如下:

package com.hebi;

import com.swetake.util.Qrcode;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * Created by 任王胡 on 2023/9/25 20:08
 */
public class Test {
    public static void main(String[] args) throws Exception {
        Qrcode qrcode=new Qrcode();
        // 纠错级别,L<M<Q<H 级别越高,存的纠错信息越多,存的有用信息就越少,图片越清晰
        qrcode.setQrcodeErrorCorrect('M');
        // 编码模式,B 表示可以存任何东西
        qrcode.setQrcodeEncodeMode('B');
        // 版本号,范围1-40,数字越大,二维码就越大
        qrcode.setQrcodeVersion(7);

        // 二维码里面存放的内容
        String content="ni cai wo cai bu cai";
        // 获取内容的字节数组,设置编码格式
        byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
        boolean[][] booleans = qrcode.calQrcode(contentBytes);

        // 这样设置可以让二维码占满图片,公式:67+12*(版本号-1)
        int imageSize=67+12*(7-1);
        BufferedImage image=new BufferedImage(imageSize,imageSize,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = image.createGraphics();
        // 设置背景色
        graphics2D.setBackground(Color.WHITE);
        // 清空原始内容
        graphics2D.clearRect(0,0,imageSize,imageSize);
        // 设定图像颜色
        graphics2D.setColor(Color.BLACK);

        // 偏移量,不设置可能导致二维码生产错误
        int pixoff=2;
        int qrcedeSize=3;
        for (int i = 0; i < booleans.length; i++) {
            for (int j = 0; j < booleans.length; j++) {
                // 如果当前位置有像素点
                if ((booleans[i][j])) {
                    // 参数依次是要画的方块的x坐标,y坐标,宽,高
                    graphics2D.fillRect(i*qrcedeSize+pixoff,j*qrcedeSize+pixoff,
                            qrcedeSize,qrcedeSize);
                }
            }
        }



        // 收起画板
        graphics2D.dispose();
        image.flush();

        // 生成一个580*580的二维码图片
        BufferedImage bufferedImage=new BufferedImage(580,580,BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bufferedImage.createGraphics();
        g.drawImage(image,0,0,580,580,null);
        g.dispose();
        bufferedImage.flush();


        File file=new File("D:\\desktop\\testQrcode.jpg");
        ImageIO.write(bufferedImage,"jpg",file);

    }
}

此时可以看到生成的二维码分辨率为580*580,图片也比之前清晰了

大佬们的链接:

http://t.csdnimg.cn/AHhAQ

http://t.csdnimg.cn/jHjOI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值