Android 生成二维码

一、生成二维码工具类封装

 1、二维码库

  // 二维码implementation 'com.journeyapps:zxing-android-embedded:4.3.0'

2、工具类


/*** 二维码* 处理工具*/public class QRCodeDealUtils {/*** @param content     字符串内容* @param size        位图宽&高(单位:px)* @param logo        二维码logo* @param logoPercent 二维码logo的占比 [0,1]* @return*/public static Bitmap createQRCodeBitmapLogo(String content, int size, Bitmap logo, float logoPercent) {Bitmap qrCodeBitmap = null;Bitmap bitmap;try {// 不带logo二维码qrCodeBitmap = generateQRCodeWithoutMargin(content, size, size);// 带logo 二维码bitmap = addLogoToQRCode(qrCodeBitmap, logo, logoPercent);} catch (WriterException e) {throw new RuntimeException(e);}return bitmap;}/*** 生成* 无白色边框* 二维码*/public static Bitmap generateQRCodeWithoutMargin(String text, int width, int height) throws WriterException {QRCodeWriter qrCodeWriter = new QRCodeWriter();Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.MARGIN, 0); // 设置边距为0BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (bitMatrix.get(x, y)) {pixels[y * width + x] = Color.BLACK; // 黑色像素} else {pixels[y * width + x] = Color.TRANSPARENT; // 透明像素,去除白边}}}Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}/*** 给二维码* 添加logo*/public static Bitmap addLogoToQRCode(Bitmap srcBitmap, Bitmap logoBitmap, float logoPercent) {// 计算Logo相对于二维码的尺寸int logoWidth = Math.round(srcBitmap.getWidth() * logoPercent);int logoHeight = Math.round(srcBitmap.getHeight() * logoPercent);// 确保Logo尺寸不会超过二维码尺寸if (logoWidth > srcBitmap.getWidth() || logoHeight > srcBitmap.getHeight()) {throw new IllegalArgumentException("Logo size is too large for the QR code.");}// 创建一个新的Bitmap来保存带Logo的二维码Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());Canvas canvas = new Canvas(resultBitmap);// 绘制原始二维码canvas.drawBitmap(srcBitmap, 0, 0, null);// 创建一个Matrix对象来缩放LogoMatrix matrix = new Matrix();matrix.postScale(logoWidth / (float) logoBitmap.getWidth(),logoHeight / (float) logoBitmap.getHeight());// 计算Logo应该放置的位置(中心)int xOffset = (srcBitmap.getWidth() - logoWidth) / 2;int yOffset = (srcBitmap.getHeight() - logoHeight) / 2;// 在二维码上绘制Logocanvas.drawBitmap(logoBitmap, xOffset, yOffset, null);return resultBitmap;}}

二、方法说明

 1、不带logo

   /*** 生成* 无白色边框* 二维码*/public static Bitmap generateQRCodeWithoutMargin(String text, int width, int height) throws WriterException {QRCodeWriter qrCodeWriter = new QRCodeWriter();Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.MARGIN, 0); // 设置边距为0BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (bitMatrix.get(x, y)) {pixels[y * width + x] = Color.BLACK; // 黑色像素} else {pixels[y * width + x] = Color.TRANSPARENT; // 透明像素,去除白边}}}Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}

   

2、给二维码添加logo的方法

   /*** 给二维码* 添加logo*/public static Bitmap addLogoToQRCode(Bitmap srcBitmap, Bitmap logoBitmap, float logoPercent) {// 计算Logo相对于二维码的尺寸int logoWidth = Math.round(srcBitmap.getWidth() * logoPercent);int logoHeight = Math.round(srcBitmap.getHeight() * logoPercent);// 确保Logo尺寸不会超过二维码尺寸if (logoWidth > srcBitmap.getWidth() || logoHeight > srcBitmap.getHeight()) {throw new IllegalArgumentException("Logo size is too large for the QR code.");}// 创建一个新的Bitmap来保存带Logo的二维码Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());Canvas canvas = new Canvas(resultBitmap);// 绘制原始二维码canvas.drawBitmap(srcBitmap, 0, 0, null);// 创建一个Matrix对象来缩放LogoMatrix matrix = new Matrix();matrix.postScale(logoWidth / (float) logoBitmap.getWidth(),logoHeight / (float) logoBitmap.getHeight());// 计算Logo应该放置的位置(中心)int xOffset = (srcBitmap.getWidth() - logoWidth) / 2;int yOffset = (srcBitmap.getHeight() - logoHeight) / 2;// 在二维码上绘制Logocanvas.drawBitmap(logoBitmap, xOffset, yOffset, null);return resultBitmap;}

  3、调用方式

    

/*** @param content     字符串内容* @param size        位图宽&高(单位:px)* @param logo        二维码logo* @param logoPercent 二维码logo的占比 [0,1]* @return*/public static Bitmap createQRCodeBitmapLogo(String content, int size, Bitmap logo, float logoPercent) {Bitmap qrCodeBitmap = null;Bitmap bitmap;try {// 不带logo二维码qrCodeBitmap = generateQRCodeWithoutMargin(content, size, size);// 带logo 二维码bitmap = addLogoToQRCode(qrCodeBitmap, logo, logoPercent);} catch (WriterException e) {throw new RuntimeException(e);}return bitmap;}

到此结束

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

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

相关文章

接口的构成

目录 接口 一、URL 二、请求方法 三、请求报文&#xff08;request message&#xff09; 3.1请求行 3.2请求头 3.3 请求体 四、响应报文&#xff08;response message&#xff09; 4.1响应行 4.2响应头 4.3响应体 接口 接口就是API&#xff0c;是程序开发的函数和方…

为什么要进行人脸识别?

人脸识别技术被广泛应用于各种场景和行业&#xff0c;其主要目的包括但不限于以下几点&#xff1a; 1. **安全验证**&#xff1a;人脸识别可以用作身份验证的一种方式&#xff0c;确保只有授权人员才能进入特定的区域或访问敏感信息。例如&#xff0c;用于解锁手机或电脑、进入…

Linux---为什么会有粘滞位?

在前面已经讲过目录的rwx权限&#xff1a; 可读权限(r): 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容. 有可写权限(w):如果目录没有可写权限&#xff0c;则无法在目录中创建文件, 也无法在目录中删除文件.可执行权限(x): 如果目录没有可执行权限, 则无法cd到…

MOUNT windows到本机

mount -t cifs -o username"Administrator",password"123456789",vers2.0,rw,uid0,gid0 //192.168.10.68/home /home/windows/windowsHome 其中&#xff1a; username"Administrator" 为Windows用户的用户名 password"123456789" …

D-Wave 推出快速退火功能,扩大量子计算性能增益

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1400字丨6分钟阅读 摘要&#xff1a;量子计算公司 D-Wave 宣布在其 Leap™ 实时量子云服务中的所有量子处理单元 (QPU) 上推出新的快速退火功能。…

Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(二)

接上文 二、注册OP_WRITE写数据 服务端代码&#xff1a; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.S…

C++ //练习 13.58 编写新版本的Foo类,其sorted函数中有打印语句,测试这个类,来验证你对前两题的答案是否正确。

C Primer&#xff08;第5版&#xff09; 练习 13.58 练习 13.58 编写新版本的Foo类&#xff0c;其sorted函数中有打印语句&#xff0c;测试这个类&#xff0c;来验证你对前两题的答案是否正确。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xf…

RFC 6071: IP Security (IPsec) and Internet Key Exchange (IKE) Document Roadmap

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/96882d1fb67b4383bc77c4dd421f7b

【一刷《剑指Offer》】面试题 10:二进制中 1 的个数

力扣对应题目链接&#xff1a;191. 位1的个数 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;二进制中1的个数_牛客题霸_牛客网 一、《剑指Offer》内容 核心考点 &#xff1a;二进制计算。 二、分析问题 1、循环检查二进制位 可以直接循环检查给定数字…

Qt 顺序容器类与关联容器类

hello&#xff01;欢迎大家来到我的Qt学习系列之顺序容器类与关联容器类。希望这篇文章能对你有所帮助&#xff01;&#xff01;&#xff01;大家也可以关注我的专栏&#xff0c;我会持续更新一些Qt的学习知识&#xff0c;和数据库的学习内容&#xff01;&#xff01;&#xff…

Springboot实现国际化以及部署Linux不生效问题

1、在application.properties 添加以下配置&#xff1a; #国际化配置 spring.messages.basenamei18n/messages/messages spring.messages.fallback-to-system-localefalse 2、添加配置文件在 resources目录下 如下图所示&#xff1a; 这个国际化文件命名有个坑&#xff0c;必须…

胸部X光图像分类:因果视角

Chest X-ray Image Classification: A Causal Perspective 摘要 这篇论文提出了一种新的方法来处理胸部X射线&#xff08;CXR&#xff09;分类问题&#xff0c;将因果推理融入到基于深度学习的方法中。尽管近年来深度学习在CXR分类方面取得了许多进展&#xff0c;但确保这些算…

【接口测试】JMeter接口关联测试

‍‍1 前言 我们来学习接口管理测试&#xff0c;这就要使用到JMeter提供的JSON提取器和正则表达式提取器了&#xff0c;下面我们来看看是如何使用的吧。 2 JSON提取器 1、添加JSON提取器 在线程组右键 > 添加 > 后置处理器 > JSON提取器 2、JSON提取器参数说明 N…

在浏览器中查看Revit模型:原理及实现

Greg Schleusner AIA 有一天向我提到&#xff0c;业内许多人认为带有 SVF2 的 Autodesk Viewer 是建筑模型最强大、性能最强的在线查看器之一&#xff0c;并且想知道开源 VIM 查看器和格式如何比较。 可以使用NSDT 3DConvert的 Revit插件 上传你的模型并在线查看预览&#xff…

vue的组件化

1.什么是组件化&#xff1f; 组件化开发 指的是&#xff1a;根据 封装 的思想&#xff0c; 把页面上可重用的 UI 结构封装为组件 &#xff0c;从而方便项目的开发和维护。 2.什么是Vue组件 组件是Vue中的一个重要概念&#xff0c;是一个可以重复使用的Vue实例&#xff0c;它拥…

Python爬虫--用户代理IP池

前面一篇讲了用户 UA 代理池&#xff0c;现在这篇来讲下 IP 代理&#xff0c; 相对于 UA 来说&#xff0c;IP 更容易被封&#xff0c; 这里讲两种方法。 方法一&#xff1a;本地ip池 方法一 就是将 IP 拿下来本地&#xff0c;然后通过随机选取或者其他来调用 这就跟之前使用…

怎么通过PHP语言实现远程控制棋牌室

怎么通过PHP语言实现远程控制棋牌室呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制棋牌室&#xff0c;通过专用的包间控制器&#xff0c;来实现包间内所有电器以及门锁的独立控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规…

洗鞋店上门预约小程序

洗鞋上门预约小程序&#xff0c;一款针对洗鞋行业的移动应用&#xff0c;让你轻松享受洗鞋的便捷服务。只需一键预约&#xff0c;多种洗鞋选项任你选&#xff0c;满足你的个性化需求。简洁明了的操作界面&#xff0c;让你快速下单&#xff0c;享受高效的洗鞋体验。 该系统凭借…

BetterDisplay Pro for Mac:显示器校准软件

BetterDisplay Pro for Mac是一款出色的显示器校准软件&#xff0c;旨在提升你的视觉体验。它提供了准确的显示器参数调整&#xff0c;包括亮度、对比度、色温和色域等&#xff0c;让你的显示器呈现更真实、清晰、细腻的图像。此外&#xff0c;软件还提供多种预设模式和自定义选…

遥感雷达波段的原理及应用

雷达波段是不同波长的组。每一种都有其独特的穿透地球表面的能力。它们还可以揭示环境的不同方面。 雷达频段在电磁频谱内具有特定的频率范围。这些波段由 L-、S-、C- 和 X-波段等字母表示。稍后会详细介绍这一点。 什么是合成孔径雷达&#xff1f; 合成孔径雷达 (SAR) 是一…