Android ZXing 二维码工具类

二维码生成器项目实战:使用ZXing库 二维码,即Quick Response Code,是一种矩阵式二维码符号,由于其能够在二维平面上存储信息,且具有高密度、高可靠性的特性,逐渐成为信息存储与传递的重要手段。 阅读详情

DevUtils Github

方法注释
createQRCodeImage生成二维码图片
decodeQRCode解析二维码图片
getResultData获取扫描结果数据
syncEncodeQRCode同步创建黑色前景色、白色背景色的二维码图片
addLogoToQRCode添加 Logo 到二维码图片上
onResult生成二维码结果回调
package dev.other;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.util.EnumMap;
import java.util.Map;

import dev.utils.LogPrintUtils;
import dev.utils.common.thread.DevThreadManager;

/**
 * detail: ZXing 二维码工具类
 * @author Ttt
 */
public final class ZXingQRCodeUtils {

    private ZXingQRCodeUtils() {
    }

    private static final String TAG = ZXingQRCodeUtils.class.getSimpleName();

    // ==============
    // = 生成二维码 =
    // ==============

    /**
     * detail: 生成二维码结果回调
     * @author Ttt
     */
    public interface QRResultCallBack {

        /**
         * 生成二维码结果回调
         * @param success 是否成功
         * @param bitmap  成功图片
         * @param e       异常信息
         */
        void onResult(boolean success, Bitmap bitmap, Exception e);
    }

    // =

    /**
     * 生成二维码图片
     * @param content 生成内容
     * @param size    图片宽高大小 ( 正方形 px )
     */
    public static void createQRCodeImage(final String content, final int size) {
        createQRCodeImage(content, size, null, null);
    }

    /**
     * 生成二维码图片
     * @param content          生成内容
     * @param size             图片宽高大小 ( 正方形 px )
     * @param qrResultCallBack 生成结果回调
     */
    public static void createQRCodeImage(final String content, final int size, final QRResultCallBack qrResultCallBack) {
        createQRCodeImage(content, size, null, qrResultCallBack);
    }

    /**
     * 生成二维码图片
     * @param content          生成内容
     * @param size             图片宽高大小 ( 正方形 px )
     * @param logo             中间 Logo
     * @param qrResultCallBack 生成结果回调
     */
    public static void createQRCodeImage(final String content, final int size, final Bitmap logo, final QRResultCallBack qrResultCallBack) {
        DevThreadManager.getInstance(10).execute(new Runnable() {
            @Override
            public void run() {
                try {
                    // 生成二维码图片
                    Bitmap qrCodeBitmap = syncEncodeQRCode(content, size);
                    if (logo != null) { // 中间 Logo
                        qrCodeBitmap = addLogoToQRCode(qrCodeBitmap, logo);
                    }
                    // 触发回调
                    if (qrResultCallBack != null) {
                        qrResultCallBack.onResult(true, qrCodeBitmap, null);
                    }
                } catch (Exception e) {
                    LogPrintUtils.eTag(TAG, e, "createQRCodeImage");
                    // 触发回调
                    if (qrResultCallBack != null) {
                        qrResultCallBack.onResult(false, null, e);
                    }
                }
            }
        });
    }

    // ==============
    // = 解析二维码 =
    // ==============

    // 解析配置
    private static final Map<DecodeHintType, Object> DECODE_HINTS = new EnumMap<>(DecodeHintType.class);

    /**
     * detail: 二维码扫描结果回调
     * @author Ttt
     */
    public interface QRScanCallBack {

        /**
         * 二维码扫描结果回调
         * @param success 是否成功
         * @param result  识别数据 {@link Result}
         * @param e       异常信息
         */
        void onResult(boolean success, Result result, Exception e);
    }

    // =

    /**
     * 解析二维码图片
     * @param bitmap         待解析的二维码图片
     * @param qrScanCallBack 解析结果回调
     */
    public static void decodeQRCode(final Bitmap bitmap, final QRScanCallBack qrScanCallBack) {
        if (bitmap == null) {
            if (qrScanCallBack != null) {
                qrScanCallBack.onResult(false, null, new Exception("bitmap is null"));
            }
            return;
        }
        // 开始解析
        DevThreadManager.getInstance(5).execute(new Runnable() {
            @Override
            public void run() {
                try {
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    int[] pixels = new int[width * height];
                    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
                    RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
                    Result result = new MultiFormatReader().decode(new BinaryBitmap(new HybridBinarizer(source)), DECODE_HINTS);
                    // 触发回调
                    if (qrScanCallBack != null) {
                        qrScanCallBack.onResult((result != null), result, null);
                    }
                } catch (Exception e) {
                    LogPrintUtils.eTag(TAG, e, "decodeQRCode");
                    // 触发回调
                    if (qrScanCallBack != null) {
                        qrScanCallBack.onResult(false, null, e);
                    }
                }
            }
        });
    }

    // ============
    // = 获取结果 =
    // ============

    /**
     * 获取扫描结果数据
     * @param result 识别数据 {@link Result}
     * @return 扫描结果数据
     */
    public static String getResultData(final Result result) {
        return (result != null) ? result.getText() : null;
    }

    // ========
    // = 编码 =
    // ========

    // 编码类型
    private static final Map<EncodeHintType, Object> ENCODE_HINTS = new EnumMap<>(EncodeHintType.class);

    static {
        // 编码类型
        ENCODE_HINTS.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 指定纠错等级, 纠错级别 ( L 7%、M 15%、Q 25%、H 30% )
        ENCODE_HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 设置二维码边的空度, 非负数
        ENCODE_HINTS.put(EncodeHintType.MARGIN, 0);
    }

    /**
     * 同步创建黑色前景色、白色背景色的二维码图片
     * @param content 生成内容
     * @param size    图片宽高大小 ( 正方形 px )
     * @return 二维码图片
     */
    public static Bitmap syncEncodeQRCode(final String content, final int size) {
        return syncEncodeQRCode(content, size, Color.BLACK, Color.WHITE);
    }

    /**
     * 同步创建指定前景色、指定背景色二维码图片
     * <pre>
     *     该方法是耗时操作, 请在子线程中调用
     * </pre>
     * @param content         生成内容
     * @param size            图片宽高大小 ( 正方形 px )
     * @param foregroundColor 二维码图片的前景色
     * @param backgroundColor 二维码图片的背景色
     * @return 二维码图片
     */
    public static Bitmap syncEncodeQRCode(final String content, final int size, final int foregroundColor, final int backgroundColor) {
        try {
            BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size, ENCODE_HINTS);
            int[] pixels = new int[size * size];
            for (int y = 0; y < size; y++) {
                for (int x = 0; x < size; x++) {
                    if (matrix.get(x, y)) {
                        pixels[y * size + x] = foregroundColor;
                    } else {
                        pixels[y * size + x] = backgroundColor;
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
            return bitmap;
        } catch (Exception e) {
            LogPrintUtils.eTag(TAG, e, "syncEncodeQRCode");
            return null;
        }
    }

    /**
     * 添加 Logo 到二维码图片上
     * <pre>
     *     非最优方法, 该方式是直接把 Logo 覆盖在图片上会遮挡部分内容
     * </pre>
     * @param src  二维码图片
     * @param logo Logo
     * @return 含 Logo 二维码图片
     */
    public static Bitmap addLogoToQRCode(final Bitmap src, final Bitmap logo) {
        if (src == null || logo == null) return src;
        // 获取图片宽度高度
        int srcWidth = src.getWidth();
        int srcHeight = src.getHeight();
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();
        // 缩放图片
        float scaleFactor = srcWidth * 1.0f / 4 / logoWidth; // 这里的 4 决定 Logo 在图片的比例 四分之一
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        try {
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(src, 0, 0, null);
            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
            canvas.save();
            canvas.restore();
        } catch (Exception e) {
            LogPrintUtils.eTag(TAG, e, "addLogoToQRCode");
            bitmap = null;
        }
        return bitmap;
    }
}
Android Studio中使用ZXing库生成和识别二维码 在第一章中,我们将初步探讨Android Studio中二维码生成与识别的核心概念及其在移动应用开发中的重要性。二维码作为一种高效的信息载体,已经广泛应用于各种业务场景,例如产品信息介绍、电子票务、移动支付等。因此,Android开发者往往需要在应用中集成生成和识别二维码的功能,以提供便捷的用户体验。Bitmap类是Android中用于处理图像的核心类之一。它可以加载、创建、转换和保存图像。 阅读详情

相关推荐

C# NX二次开发:两种过滤器设置方案的实战解析与场景适配

本文深入解析C# NX二次开发中的两种过滤器设置方案:AddFilterHandler回调与MaskTriple属性设置。通过实战案例对比其性能差异与适用场景,帮助开发者根据需求选择最优方案,提升NX插件开发效率与交互体验。特别针对BlockStyler集成场景提供专业建议,是NX二次开发者的实用指南。

weixin_33739646的博客 844

Android之 Zxing二维码详解

Zxing二维码详解

qq_29848853的博客 1万+

fastadmin云快充充电桩系统部署文档uniapp

多商户 嘎嘎快充V1.0部署文档 一、服务器环境: 服务器配置4核心8GB内存5M带宽以上配置 VX next1402 只支持linux环境 nginx1.22 php7.2 开启redis、fileinfo扩展,关闭禁用workerman gatewayworkerman需要的函数,如pcntl相关的函数 mysql5.7 supervisor redis 注意: 1.站点必须配置https、websocket配置wss 2.注意开放直连服务端口:2024,并添加到安全组 二、必

itholiday2014的博客 1629

Android二维码工具zxing使用

二维码在我们生活中随处可见,在我眼里简直可以用“泛滥”来形容啦!那如何在我们Android项目中扫描识别二维码或生成二维码图片呢? 我们通常使用的开源框架是zxing。在github上的开源地址:https://github.com/zxing/zxing,目前在做的项目中也用到这个框架, 所以自己做了个demo,方便学习及下次使用。 识别二维码 /** * 扫描二维码示例 */ pub

true100的专栏 1933

[FPGA高速以太网]基于Verilog与1G/2.5G Ethernet PCS/PMA IP核的2.5G UDP通信实战

本文详细介绍了基于FPGA与1G/2.5G Ethernet PCS/PMA IP核实现2.5G UDP通信的完整实战方案。文章以黑金AX7A200开发板为硬件平台,深入讲解了从硬件选型、IP核配置、Verilog测试逻辑编写到系统调试与性能验证的全过程,重点剖析了利用SGMII接口与GTP收发器实现高速数据传输的关键技术与避坑指南,为FPGA高速以太网应用开发提供了宝贵经验。

sql99的博客 567

Solidworks曲面建模学习(二)——3D草图

本文主要是演示有一些零件在solidworks中通过3D草来绘制会更加方便。

东东不熬夜的博客 9500

Android中二维码的扫描与生成(zxing库)

2.集成java源码,将demo工程QrScan中app/src/main/java/目录下包中的zxing和util复制到此工程对应的app/src/main/java的包下。layout复制activity_capture.xml,activity_scanner.xml,toolbar_scanner.xml。values复制/替换其中的attrs.xml,ids.xml,colors.xml。1.将获取的jar包复制到工程的app/libs目录下,刷新,然后去添加依赖。...

Ai1114的博客 3万+

高效利用ChEMBL数据库:从靶点查询到活性数据处理的完整指南

本文提供了高效利用ChEMBL数据库的完整指南,从靶点查询到活性数据处理。详细介绍了靶点精准定位、高级过滤技巧、数据导出优化以及活性数据清洗、特征工程和可视化等实战技巧,帮助药物研发人员快速获取和处理生物活性数据,提升工作效率。

weixin_29278805的博客 792

Android工具类: 基于Zxing的二维码生成和展示

前言Android日常开发中,不可避免遇到二维码开发的需求,本文抛开扫描解析二维码,提供一下生成二维码的思路,和封装好的工具类,很简单实现二维码生成和展示。注意:本文二维码生成基于著名的二维码库:Zxing v3.2.1所以你需要先添加Zxing的Jar包 在Gradle中添加对Zxing的依赖如果你觉得看一篇文章太麻烦,请直接跳到文章末尾,按说明,轻松实现二维码解析&生成需求基本上有这几种: 生成

却把清梅嗅的博客 2476

PCIE Lane Margining Linux 环境配置

Copy all the provided files in folder PYC38 or PYC310 to the created pcie_lmt folder. Index of /ftp/python/3.8.10/Copy below commands to a file and rename it as "scan_pcie.py", the commands are from "685662 PCIe-LMT-Gen4_Gen5-r0p77.pdf" in the lane margi

mysongshine的博客 1435

使用MATLAB的COMSOL LiveLink:实时连接和数据传输

COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。使用COMSOL LiveLink,你可以进行更复杂的模型设置和数据传输使用MATLAB的COMSOL LiveLink:实时连接和数据传输。

PixelNinja的博客 2089

Android工具类之ZXing(二维码/条形码)

介绍 ZXing,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他语言的端口。 地址 GitHub地址:https://github.com/zxing/zxing API文档:https://zxing.github.io/zxing/apidocs/index.html 目前最新版本为3.

移动,移着动动 1263

SPICE仿真软件:HSPICE_(22).HSPICE仿真案例分析

通过上述案例分析,我们可以看到HSPICE仿真软件在不同电路类型和仿真场景中的应用。无论是简单的直流分析、交流分析还是复杂的暂态分析,HSPICE都能提供详细的仿真结果,帮助我们更好地理解和优化电路设计。希望这些案例能够为读者提供实用的参考和指导,进一步提升使用HSPICE进行电路仿真的能力。输入文件的编写:确保输入文件格式正确,使用注释来解释每一部分的内容。分析类型的选择:根据电路的特点选择合适的分析类型,如.DC.AC和.TRAN。输出结果的设置:使用.print命令来指定需要输出的节点电压和支路电流。

kkchenjj的博客 1306

Android:使用ZXing生成二维码(支持添加Logo图案)

Android:使用ZXing生成二维码(支持添加Logo图案)

books1958的专栏 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Android】学习之路——生成二维码(ZXing库)

本文介绍了在Android 项目中使用 ZXing 库生成二维码的方法。首先需在 build.gradle 中添加相关依赖并同步项目。接着创建布局文件,通过 ImageView 显示二维码。将生成逻辑封装在 QRCodeUtil 工具类,可提高复用性。在 GenerateQRCodeActivity 里调用工具类生成二维码并显示。使用 Handler 优化代码,把二维码生成操作放在子线程进行,避免阻塞主线程,完成后通过 Handler 将 Bitmap 传递到主线程更新 ImageView,确保界面流畅。

weixin_63695176的博客 1127

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android zxing创建和扫描二维码

1.在项目的libs目录下添加zxing.jar包,并在build中引用 implementation files('libs/zxing.jar') 2.在AndroidManifest.xml文件中添加权限 <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

yyxhzdm的博客 532

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android二维码开发(一)——生成二维码

二维码的应用非常广泛,用途也很多,网上也有很多实用的精简包可以引入,本篇主要记录了不用引入新的module,自己集成生成二维码功能的过程。 一、引入依赖 首先在libs文件目录下放进jar包zxing.jar,然后引入依赖,sync。 implementation files('libs/zxing.jar') 也可以在file/project structure/app/dependenci...

小王同学的博客 8282

Android 中使用开源库 ZXing 生成二维码图片

在 Android 中生成二维码是一个比较常见的功能,可以使用开源库 ZXing(Zebra Crossing)库来实现,这是一个非常流行的二维码生成和扫描库。

casual_clover的博客 389

生成二维码图片(android)

一、在项目app的build.gradle里添加Zxing依赖库; implementation 'com.google.zxing:core:3.3.0' 二、编写一个生成二维码的工具类 public class CreatQrCodeUtil { //生成普通二维码bitmap,中心不带logo图片 public static Bitmap CreatEwmImg(St...

qq_41188773的博客 1157

ZXing实现二维码扫描

   二维码现在越来越火爆,使用的越发广泛,对于二维码二维码的生成与解析,有多种途径,这里我选择用google老大的ZXing。   其中刘超大神使用ZXing写了一个快速集成二维码扫描的工具类,实现其核心的实现扫描的功能。使用时通过调用二维码工具类,几行代码就可以实现二维码扫描的功能。   参考资料:       二维码工具类下载地址:  https://github.com/yipianfen...

houyingshang的博客 377

Android二维码生成

1.首先导入zxing包 2.导入工具类 /** * 二维码生成工具类 */ public class QRCodeUtil { /** * 生成二维码Bitmap * * @param content 内容 * @param widthPix 图片宽度 * @param heightPix 图片高度 * @param

一页漂洋过海 521

Android使用zxing(二维码工具类)类库的导入方式

zXing导入比较麻烦,很多新人要导入很久,关键是还不一定导入的对。下面总结下导入方式。希望对大家有所帮助。 转载于:https://blog.51cto.com/zhenchao125/1707015...

weixin_34358365的博客 274

Android:使用ZXing生成二维码(支持加入Logo图案)

ZXing是谷歌的一个开源库。能够用来生成二维码、扫描二维码。本文所介绍的是第一部分。 首先上效果图: ZXing相关各种文件官方下载地址:https://github.com/zxing/zxing/releases  或者在这里下载(仅仅有本项目所用的jar包,版本:3.2.0):链接: http://pan.baidu.com/s/1hq3s5EW password...

weixin_34151004的博客 266

安卓zxing实现生成二维码和扫描二维码

ZXing依赖库导入 大家对build.gradle肯定不陌生,就是AS项目的配置文件,既然Demo需要依赖zxing核心库,步骤如下: AS工程目录app下的build.gradle 添加 依赖 dependencies { compile 'com.google.zxing:core:3.3.0'; compile 'com.google.zxing:an...

dianziagen的博客 5644
上一篇: Android WebView 辅助类
「已注销」
博客等级 码龄11年 14粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值