不带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,图片也比之前清晰了
大佬们的链接: