Java 二维码

news2025/6/12 17:10:15

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();
		}

		//下载 二维码 图片


	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…