-
Android生成二维码工具类封装及使用
最近公司业务上有个生成二维码图片的需求(Android端),之后笔者在网上查阅了一些资料,实现了这个功能,这篇文章主要给大家介绍了关于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;
}
总结
到此这篇关于Android生成二维码工具类封装及使用的文章就介绍到这了,更多相关Android生成二维码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持
原文链接:https://blog.csdn.net/shi450561200/article/details/138157852
栏目列表
最新更新
vbscript基础篇 - vbs数组Array的定义与使用方
vbscript基础篇 - vbs变量定义与使用方法
vbs能调用的系统对象小结
vbscript网页模拟登录效果代码
VBScript 根据IE窗口的标题输出ESC
杀死指定进程名称的小VBS
通过vbs修改以点结尾的文件的属性为隐藏
查询电脑开关机时间的vbs代码
VBA中的Timer函数用法
ComboBox 控件的用法教程
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比