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); // 设置边距为0

        BitMatrix 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对象来缩放Logo
        Matrix 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;

        // 在二维码上绘制Logo
        canvas.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); // 设置边距为0

        BitMatrix 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对象来缩放Logo
        Matrix 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;

        // 在二维码上绘制Logo
        canvas.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.mfbz.cn/a/584726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CPU架构

一、CPU组成 CPU内部由ALU&#xff08;算术逻辑单元&#xff09;、CU&#xff08;控制器&#xff09;、寄存器&#xff08;PC、IR、PSW、DR、通用寄存器等&#xff09;、中断系统组成&#xff0c;外部通过总线与控制总线、数据总线、地址总线进行相连&#xff0c;对数据和程序…

【保姆级讲解如何安装与配置Xcode】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

第十二章 案例二:配置Trunk,实现相同VLAN的跨交换机通信

1、实验环境 公司的员工人数已达到 100 人&#xff0c;其网络设备如图12.13所示&#xff0c;现在的网络环境导致广播较多网速慢&#xff0c;并且也不安全&#xff0c;公司希望按照部门划分网络&#xff0c;并且能够保证一定的网络安全性 图12.13 实验案例二拓扑图 其网络规划…

环境安装:python环境迁移(无网和有网)

前言 环境部署或迁移是一项简单而又考验应对能力的一项工作&#xff0c;需要考虑到网络环境的情况&#xff0c;无网环境下需要采取离线方式进行操作&#xff0c;有网环境则可以直接通过在线安装完成。 在进行Python环境迁移时&#xff0c;需要注意保持环境的一致性&#xff0c;…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion&#xff0c;一款强大的多功能工具&#xff0c;可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号&#xff0c;来到首页&#xff0c;点击设置&#xff0c;左边…

LED显示屏黑屏的常见原因及解决办法

LED显示屏在使用过程中偶尔会出现黑屏现象&#xff0c;可能由多种原因引起。以下是LED显示屏出现黑屏的主要情况及相应的解决办法&#xff1a; 1. 上电的瞬间就是黑的 原因&#xff1a;可能是因为上电过程中出现了一些异常情况&#xff0c;导致屏幕无法正常显示。 解决办法&…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来&#xff0c;本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已…

洗地机哪个牌子质量最好?四款年度口碑品牌盘点

在当今家庭生活中&#xff0c;洗地机技术的飞速发展给我们的日常带来了极大的便利。洗地机作为智能家居领域的佼佼者&#xff0c;其实用性和智能化程度受到越来越多消费者的欢迎。许多人在选洗地机时会纠结一个问题&#xff1a;洗地机哪个牌子质量最好&#xff1f; 洗地机怎么…

# 谷歌 Chrome 浏览器无法安装插件的解决方法

谷歌 Chrome 浏览器无法安装插件的解决方法 运用开发模式安装 安装步骤&#xff1a; 1、 将 XX.crx 插件的扩展名改成 .zip 或者 .rar 并解压到文件夹 XX 目录。 1&#xff09;如&#xff1a;下载的 前端框架 vue.js 插件 nhdogjmejiglipccpnnnanhbledajbpd-6.6.1-Crx4Chro…

【AGX】Ubuntu20.04 + ROS_ noetic+ 大疆Mid360激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;最近组装机器人&#xff0c;使用到了大疆孵化的圳市览沃科技有限公司&#xff08;简称Livox览沃科技&#xff09;推出的觅道系列全新混合固态激光雷达Mid-360&#xff0c;顺便试试效果&#xff0c;也记录一下使用入门过程。 "觅道M…

自然语言处理 (NLP) 和文本分析

自然语言处理 (NLP) 和文本分析&#xff1a;NLP 在很多领域都有着广泛的应用&#xff0c;如智能助手、语言翻译、舆情分析等。热门问题包括情感分析、命名实体识别、文本生成等。 让我们一起来详细举例子的分析讲解一下自然语言处理&#xff08;NLP&#xff09;和文本分析的应用…

基于java+springboot+vue实现的新闻资讯系统(文末源码+Lw)216

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;文章信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

String2⃣️-string类对象的修改操作

目录 string类对象的修改操作 1.push back &#xff1b;append&#xff1b;operator 2.assign&#xff1b;insert 3.erase&#xff1b;replace 4.rfind 5.substr 6.c_str 补充 1.reverse&#xff08;逆置 反转&#xff09; 2.Sort string类对象的修改操作 1.push back …

【算法刷题 | 贪心算法07】4.29(用最少数量的箭引爆气球、无重叠区间)

文章目录 12.用最少数量的箭引爆气球12.1题目12.2解法&#xff1a;贪心12.2.1贪心思路12.2.2代码实现 13.无重叠区间13.1题目13.2解法&#xff1a;贪心13.2.1贪心思路13.2.2代码实现 12.用最少数量的箭引爆气球 12.1题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面…

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通&#xff08;08&#xff09;——对标尚硅谷Kafka教程 5. Kafka优化5.1 资源配置5.1.1 操作系统5.1.2 磁盘选择5.1.3 网络带宽5.1.4 内存配置5.1.5 CPU选择 5.2 集群容错5.2.1 副本分配策略5.2.2 故障转移方案5.2.3 数据备份与恢复 5.3 参数配置优化5.4 数…

如何在WordPress中设置网站的SEO标题和描述

在WordPress中&#xff0c;想要让你的网站在搜索引擎结果中脱颖而出&#xff0c;设置优秀的SEO标题和描述至关重要。这不仅可以帮助搜索引擎更好地理解你的网站内容&#xff0c;还可以吸引更多的点击率和流量。而选择一款合适的SEO插件是实现这一目标的关键之一。让我们来看看两…

电路邱关源学习笔记——3.6结点电压法

1.结点电压法 以结点电压为未知量列写电路方程分析电路的方法。适用于结点较少的电路。 基本思想 选取结点电压为未知量&#xff0c;则KVL自动满足&#xff0c;无需列写KVL方程。各支路电流、电压可视为结点电压的线性组合。求出结点电压之后&#xff0c;便可方便地得到各支路…

怎样批量将jpg图片转换成HEIC格式?jpg快速转换成HEIC图片

heic格式和jpg格式图片大家都很熟悉了。那么这两种图片格式的区别是什么&#xff1f;哪种格式图片更好一些&#xff1f; 一&#xff0c;区别&#xff1a;jpg和HEIC的区别 1&#xff0c;jpg格式有良好的压缩性能和良好的重建质量而被广泛应用于图像和视频处理中。 2&#xff…

代码随想录刷题随记29-贪心3

代码随想录刷题随记29-贪心3 1005.K次取反后最大化的数组和 leetcode链接 比较简单&#xff0c;首先对数组进行绝对值排序&#xff0c;然后如果是负数从小到大进行反转 如果是正数&#xff0c;就对一个绝对值最小的一直翻转 按照绝对值排序的实现可以通过重写比较器实现 cla…
最新文章