Java 二维码
**技术:**谷歌 ZXing 实现
首先添加依赖
<!-- 二维码依赖 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
使用ZXing 生成二维码的方法
public static void erweima() throws WriterException, IOException {
String s = new String("你好,我是你爹!");
//第一步 :设置二维码相关参数
String charset = "utf-8";
//首先需要创建一个map集合,来存储二维码的 配置信息
Map map = new HashMap();
//设置二维码的误差校正级别 例如墨水不清晰,打印出来的清晰度,拍出来的图像
//L 7% M 15% Q 25% H 30% 容错率,容错率越高,二维码越容易被识别
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
//设置二维码的字符集
map.put(EncodeHintType.CHARACTER_SET,charset);
//设置二维码四周的留白
map.put(EncodeHintType.MARGIN,2);
//第二步:创建 ZXing 对象,MultiFormatWriter(多格式写入)
//通过 MultiFormatWriter 创建一个二维码对象,
MultiFormatWriter writer = new MultiFormatWriter();
// writer.encode(内容 , 什么格式的二维码 , 二维码宽度 , 二维码高度 , 二维码参数);
//BarcodeFormat 枚举 二维码类型 QR_CODE 最普通的 Aztec code
//返回 位矩阵对象 (内部实际上是 一个二维数组,每一个元素是boolean类型的 true代表黑色,false代表白色)
BitMatrix encode = writer.encode(s, BarcodeFormat.QR_CODE, 50, 50, map);
//获得矩阵的宽度和高度
int width = encode.getWidth();
int height = encode.getHeight();
//生成二维码图片
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//编写一个嵌套循环 遍历 位矩阵对象 填充二维码图片
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
//判断当前坐标是否是黑色
boolean color = encode.get(x, y);
//如果是黑色,就设置为黑色
if (color) {
bufferedImage.setRGB(x, y, 0x000000); // 0x000000是黑色
} else {
bufferedImage.setRGB(x, y, 0xffffff); // 0xffffff是白色
}
}
}
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path+"\\erweima.png");
ImageIO.write(bufferedImage, "png", file);
System.out.println("图片生成成功");
}
给二维码添加logo
public static void erweima() throws WriterException, IOException {
String s = new String("你好,我是你爹!");
//第一步 :设置二维码相关参数
String charset = "utf-8";
//首先需要创建一个map集合,来存储二维码的 配置信息
Map map = new HashMap();
//设置二维码的误差校正级别 例如墨水不清晰,打印出来的清晰度,拍出来的图像
//L 7% M 15% Q 25% H 30% 容错率,容错率越高,二维码越容易被识别
map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
//设置二维码的字符集
map.put(EncodeHintType.CHARACTER_SET,charset);
//设置二维码四周的留白
map.put(EncodeHintType.MARGIN,2);
//第二步:创建 ZXing 对象,MultiFormatWriter(多格式写入)
//通过 MultiFormatWriter 创建一个二维码对象,
MultiFormatWriter writer = new MultiFormatWriter();
// writer.encode(内容 , 什么格式的二维码 , 二维码宽度 , 二维码高度 , 二维码参数);
//BarcodeFormat 枚举 二维码类型 QR_CODE 最普通的 Aztec code
//返回 位矩阵对象 (内部实际上是 一个二维数组,每一个元素是boolean类型的 true代表黑色,false代表白色)
BitMatrix encode = writer.encode(s, BarcodeFormat.QR_CODE, 800, 800, map);
//获得矩阵的宽度和高度
int width = encode.getWidth();
int height = encode.getHeight();
//生成二维码图片
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//编写一个嵌套循环 遍历 位矩阵对象 填充二维码图片
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
//判断当前坐标是否是黑色
boolean color = encode.get(x, y);
//如果是黑色,就设置为黑色
if (color) {
bufferedImage.setRGB(x, y, 0x000000); // 0x000000是黑色
} else {
bufferedImage.setRGB(x, y, 0xffffff); // 0xffffff是白色
}
}
}
添加部分:
//给二维码添加logo
File file1 = new File("D:\\Users\\lenovo\\Desktop\\詹姆斯蓝色chosen1.jpg");
Image logo = ImageIO.read(file1); //logo图片
//对获取到的log进行缩放
int logoHeight = logo.getHeight(null);
int logoWidth = logo.getWidth(null);
if (logoWidth > 60){
logoWidth = 60;
}
if (logoHeight > 60){
logoHeight = 60;
}
//下面对logo进行缩放 重要 返回一个缩放之后的logo
//使用平滑缩放算法(Image.SCALE_SMOOTH) , 避免锯齿
Image logoimage = logo.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);
//将缩放之后的 logo 放到二维码上
//获取2D画笔
Graphics2D graphics2D = bufferedImage.createGraphics();
//指定 从哪里开始画 (横,纵坐标)
int x = (800 - logoWidth) / 2;
int y = (800 - logoHeight) / 2;
//将缩放之后的logo画上去
graphics2D.drawImage(logoimage, x, y, null);
//让图片圆润点
Shape shape = new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 10, 10);
//logo 边框的粗细
graphics2D.setStroke(new BasicStroke(2f));
//给logo画
graphics2D.draw(shape);
//释放画笔
graphics2D.dispose();
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path+"\\erweima.png");
ImageIO.write(bufferedImage, "png", file);
System.out.println("图片生成成功");
}
技术: Git Hub开源项目 qrcode 实现
首先添加 依赖
<!-- 基于 Github QRcode 实现二维码-->
<dependency>
<groupId>com.github.liuyueyi.media</groupId>
<artifactId>qrcode-plugin</artifactId>
<version>2.5.2</version>
</dependency>
代码实现——黑白二维码
public static void qrcode(){
//获取 二维码 内容
String url = "https://s.weibo.com/weibo?q=%23%E4%B8%80%E8%A7%89%E9%86%92%E6%9D%A53%E4%B8%AA%E4%B8%AD%E5%9B%BD%E4%BA%BA%E4%B8%8A%E5%A4%A9%E4%BA%86%23&t=31&band_rank=1&Refer=top";
try {
//生成黑白的二维码
BufferedImage bufferedImage = QrCodeGenWrapper.of(url).asBufferedImage();
//下载 二维码 图片
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path + "\\ercode.png");
//参数一 :BufferedImage对象 , 参数二:图片格式,参数三:输出的地址
ImageIO.write(bufferedImage, "png", file);
System.out.println("qrcode 生成二维码成功!");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
代码实现——带 logo 二维码
public static void qrcode(){
//获取 二维码 内容
String url = "https://baike.baidu.com/item/%e5%8b%92%e5%b8%83%e6%9c%97%c2%b7%e8%a9%b9%e5%a7%86%e6%96%af/1989503";
//生成二维码
try {
! //logo 图片
! File file1 = new File("D:\\Users\\lenovo\\Desktop\\詹姆斯蓝色chosen1.jpg");
! //获得图片的输入流
! InputStream inputStream = Files.newInputStream(file1.toPath());
//生成黑白的
BufferedImage bufferedImage = QrCodeGenWrapper.of(url)
! .setLogo(inputStream) //设置 logo 图片
! .setLogoRate(7) //设置 logo 占 二维码的比例 九分之一
! .setLogoStyle(QrCodeOptions.LogoStyle.ROUND) //将 logo 设置为 圆弧
.asBufferedImage();
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path + "\\ercode.png");
//参数一 :BufferedImage对象 , 参数二:图片格式,参数三:输出的地址
ImageIO.write(bufferedImage, "png", file);
System.out.println("qrcode 生成二维码成功!");
} catch (Exception e) {
throw new RuntimeException(e);
}
//下载 二维码 图片
}
代码实现——彩色的二维码
public static void qrcode(){
//获取 二维码 内容
String url = "https://baike.baidu.com/item/%e5%8b%92%e5%b8%83%e6%9c%97%c2%b7%e8%a9%b9%e5%a7%86%e6%96%af/1989503";
//生成二维码
try {
//logo 图片
File file1 = new File("D:\\Users\\lenovo\\Desktop\\詹姆斯蓝色chosen1.jpg");
//获得图片的输入流
InputStream inputStream = Files.newInputStream(file1.toPath());
//生成黑白的
BufferedImage bufferedImage = QrCodeGenWrapper.of(url)
! .setDrawPreColor(Color.CYAN) //设置二维码的颜色
.setLogo(inputStream) //设置 logo 图片
.setLogoRate(7) //设置 logo 占 二维码的比例 九分之一
.setLogoStyle(QrCodeOptions.LogoStyle.ROUND) //将 logo 设置为 圆弧
.asBufferedImage();
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path + "\\ercode.png");
//参数一 :BufferedImage对象 , 参数二:图片格式,参数三:输出的地址
ImageIO.write(bufferedImage, "png", file);
System.out.println("qrcode 生成二维码成功!");
} catch (Exception e) {
throw new RuntimeException(e);
}
//下载 二维码 图片
}
代码实现——带有背景图
public static void qrcode(){
//获取 二维码 内容
String url = "https://baike.baidu.com/item/%e5%8b%92%e5%b8%83%e6%9c%97%c2%b7%e8%a9%b9%e5%a7%86%e6%96%af/1989503";
//生成二维码
try {
//logo 图片
File file1 = new File("D:\\Users\\lenovo\\Desktop\\詹姆斯蓝色chosen1.jpg");
//获得图片的输入流
InputStream inputStream = Files.newInputStream(file1.toPath());
//生成黑白的
BufferedImage bufferedImage = QrCodeGenWrapper.of(url)
! .setBgImg(inputStream) //设置背景图片
! .setBgOpacity(0.4f) //设置透明度 0-1 越大越透明
.asBufferedImage();
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path + "\\ercode.png");
//参数一 :BufferedImage对象 , 参数二:图片格式,参数三:输出的地址
ImageIO.write(bufferedImage, "png", file);
System.out.println("qrcode 生成二维码成功!");
} catch (Exception e) {
System.out.println("报错了");
e.printStackTrace();
}
//下载 二维码 图片
}
代码实现——设置特殊形状
public static void qrcode(){
//获取 二维码 内容
String url = "https://baike.baidu.com/item/%e5%8b%92%e5%b8%83%e6%9c%97%c2%b7%e8%a9%b9%e5%a7%86%e6%96%af/1989503";
//生成二维码
try {
//生成黑白的
BufferedImage bufferedImage = QrCodeGenWrapper.of(url)
! .setDrawEnableScale(true) //启动 二维码绘制时的缩放 设置形状必须开启!!!
! .setDrawStyle(QrCodeOptions.DrawStyle.DIAMOND) //设置二维码的样式 为钻石
.asBufferedImage();
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path + "\\ercode.png");
//参数一 :BufferedImage对象 , 参数二:图片格式,参数三:输出的地址
ImageIO.write(bufferedImage, "png", file);
System.out.println("qrcode 生成二维码成功!");
} catch (Exception e) {
System.out.println("报错了");
e.printStackTrace();
}
//下载 二维码 图片
}
代码实现——生成图片填充二维码
public static void qrcode(){
//获取 二维码 内容
String url = "https://baike.baidu.com/item/%e5%8b%92%e5%b8%83%e6%9c%97%c2%b7%e8%a9%b9%e5%a7%86%e6%96%af/1989503";
//生成二维码
try {
File file1 = new File("D:\\Users\\lenovo\\Desktop\\詹姆斯蓝色chosen1.jpg");
InputStream inputStream = Files.newInputStream(file1.toPath());
//生成黑白的
BufferedImage bufferedImage = QrCodeGenWrapper.of(url)
! .setErrorCorrection(ErrorCorrectionLevel.H) //设置二维码的 容错率
! .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE) //绘制二维码时 采用图片填充
! .addImg(1,1,inputStream)
.asBufferedImage();
String path = "D:\\Users\\lenovo\\Desktop\\xxl-job代码\\xxl-job\\xxl-job-admin\\src\\main\\resources\\static";
File file = new File(path + "\\ercode.png");
//参数一 :BufferedImage对象 , 参数二:图片格式,参数三:输出的地址
ImageIO.write(bufferedImage, "png", file);
System.out.println("qrcode 生成二维码成功!");
} catch (Exception e) {
System.out.println("报错了");
e.printStackTrace();
}
//下载 二维码 图片
}