iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android平台生成二维码并实现扫描 & 识别功能
  • 644
分享到

Android平台生成二维码并实现扫描 & 识别功能

生成二维码二维二维码Android 2022-06-06 08:06:32 644人浏览 薄情痞子
摘要

1.二维码的前世今生 “二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信

1.二维码的前世今生

“二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。 [1] ”

上面是百度百科的解释。既然有二维码,那么肯定有一维码。

一维码。最为常见的就是食品 & 书本后面的条码。

条码起源与20世纪40年代,后来在1970年 UPC码发明,并开始广泛应用与食品包装。

具体的介绍可以看百度百科 一维码。

其实二维码与一维码本质上是类似的,就跟一维数组和二维数组一样。

2.二维码的java支持库

为了让java或者说Android方便继承条码的功能,Google就开发了一个zxing的库:

https://GitHub.com/zxing/zxing

3.生成二维码


public class EncodeThread {
public static void encode(final String url, final int width, final int height, final EncodeResult result) {
if (result == null) {
return;
}
if (TextUtils.isEmpty(url)) {
result.onEncodeResult(null);
return;
}
new Thread() {
@Override
public void run() {
try {
MultiFORMatWriter writer = new MultiFormatWriter();
Hashtable<EncodeHintType, String> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = writer.encode(url, BarcodeFormat.QR_CODE, width, height, hints);
Bitmap bitmap = parseBitMatrix(bitMatrix);
result.onEncodeResult(bitmap);
return;
} catch (WriterException e) {
e.printStackTrace();
}
result.onEncodeResult(null);
}
}.start();
}

public static Bitmap parseBitMatrix(BitMatrix matrix) {
final int QR_WIDTH = matrix.getWidth();
final int QR_HEIGHT = matrix.getHeight();
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
//this we using qrcode algorithm
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (matrix.get(x, y)) {
pixels[y * QR_WIDTH + x] = 0xff000000;
} else {
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
return bitmap;
}
public interface EncodeResult {
void onEncodeResult(Bitmap bitmap);
}
} 

zxing 支持很多条码格式:我们这里使用QR_CODE码。也就是我们常见的微信里面的二维码。

我们先来分析下这段代码:

MultiFormatWriter writer = new MultiFormatWriter();

这个是一个工具类,把所有支持的几个write写在里面了。


public BitMatrix encode(String contents,
BarcodeFormat format,
int width, int height,
Map<EncodeHintType,?> hints) throws WriterException {
Writer writer;
switch (format) {
case EAN_8:
writer = new EAN8Writer();
break;
case UPC_E:
writer = new UPCEWriter();
break;
case EAN_13:
writer = new EAN13Writer();
break;
case UPC_A:
writer = new UPCAWriter();
break;
case QR_CODE:
writer = new QRCodeWriter();
break;
case CODE_39:
writer = new Code39Writer();
break;
case CODE_93:
writer = new Code93Writer();
break;
case CODE_128:
writer = new Code128Writer();
break;
case ITF:
writer = new ITFWriter();
break;
case pdf_417:
writer = new PDF417Writer();
break;
case CODABAR:
writer = new CodaBarWriter();
break;
case DATA_MATRIX:
writer = new DataMatrixWriter();
break;
case AZTEC:
writer = new AztecWriter();
break;
default:
throw new IllegalArgumentException("No encoder available for format " + format);
}
return writer.encode(contents, format, width, height, hints);
} 

这是官方最新支持的格式,具体看引入的jar里面支持的格式。

对与bitmatrix的结果,通过摸个算法,设置每个点白色,或者黑色。

最后创建一张二维码的图片。

4.识别二维码

如何从一张图片上面,识别二维码呢:


public class ReDecodeThread {
public static void encode(final Bitmap bitmap, final ReDecodeThreadResult listener) {
if (listener == null) {
return;
}
if (bitmap == null) {
listener.onReDecodeResult(null);
return;
}
new Thread() {
@Override
public void run() {
try {
MultiFormatReader multiFormatReader = new MultiFormatReader();
BitmapLuminanceSource source = new BitmapLuminanceSource(bitmap);
BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
Result result1 = multiFormatReader.decode(bitmap1);
listener.onReDecodeResult(result1.getText());
return;
} catch (NotFoundException e) {
e.printStackTrace();
}
listener.onReDecodeResult(null);
}
}.start();
}
public interface ReDecodeThreadResult {
void onReDecodeResult(String url);
}
} 

过程也是很简单,使用MultiFormatReader来分析图片,这里不需要缺人图片的条码格式。

如果分析下源码,就是依次使用每种格式的reader来分析,直到找到合适的为止。

当然回了能够把Bitmap转化成Bitmatrix,然后在分析。


public final class BitmapLuminanceSource extends LuminanceSource{
private final byte[] luminances;
public BitmapLuminanceSource(String path) throws FileNotFoundException {
this(loadBitmap(path));
}
public BitmapLuminanceSource(Bitmap bitmap) {
super(bitmap.getWidth(), bitmap.getHeight());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
// In order to measure pure decoding speed, we convert the entire image
// to a greyscale array
// up front, which is the same as the Y channel of the
// YUVLuminanceSource in the real app.
luminances = new byte[width * height];
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
int pixel = pixels[offset + x];
int r = (pixel >> 16) & 0xff;
int g = (pixel >> 8) & 0xff;
int b = pixel & 0xff;
if (r == g && g == b) {
// Image is already greyscale, so pick any channel.
luminances[offset + x] = (byte) r;
} else {
// Calculate luminance cheaply, favoring green.
luminances[offset + x] = (byte) ((r + g + g + b) >> 2);
}
}
}
}
@Override
public byte[] getRow(int y, byte[] row) {
if (y < 0 || y >= getHeight()) {
throw new IllegalArgumentException("Requested row is outside the image: " + y);
}
int width = getWidth();
if (row == null || row.length < width) {
row = new byte[width];
}
System.arraycopy(luminances, y * width, row, 0, width);
return row;
}
// Since this class does not support cropping, the underlying byte array
// already contains
// exactly what the caller is asking for, so give it to them without a copy.
@Override
public byte[] getMatrix() {
return luminances;
}
private static Bitmap loadBitmap(String path) throws FileNotFoundException {
Bitmap bitmap = BitmapFactory.decodeFile(path);
if (bitmap == null) {
throw new FileNotFoundException("Couldn't open " + path);
}
return bitmap;
}
} 

5.扫描二维码

扫描二维码,其实比上面只多了一步,就是把camera获取的东西直接转换,然后进行识别。


public void requestPreviewFrame(Handler handler, int message) {
if (camera != null && previewing) {
previewCallback.setHandler(handler, message);
if (useOneShotPreviewCallback) {
camera.setOneShotPreviewCallback(previewCallback);
} else {
camera.setPreviewCallback(previewCallback);
}
}
} 

首先把camera预览的数据放入previewCallback中。


final class PreviewCallback implements Camera.PreviewCallback 
public void onPreviewFrame(byte[] data, Camera camera) {
Point cameraResolution = configManager.getCameraResolution();
if (!useOneShotPreviewCallback) {
camera.setPreviewCallback(null);
}
if (previewHandler != null) {
Message message = previewHandler.obtainMessage(previewMessage, cameraResolution.x,
cameraResolution.y, data);
message.sendToTarget();
previewHandler = null;
} else {
Log.d(TAG, "Got preview callback, but no handler for it");
}
} 

可以看到,预览的数据data,回传递过来,然后handler的方式传递出去。

接收data的地方:


@Override
public void handleMessage(Message message) {
switch (message.what) {
case R.id.decode:
//Log.d(TAG, "Got decode message");
decode((byte[]) message.obj, message.arg1, message.arg2);
break;
case R.id.quit:
Looper.myLooper().quit();
break;
}
} 

然后是decode data


private void decode(byte[] data, int width, int height) {
long start = System.currentTimeMillis();
Result rawResult = null;
//modify here
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width; // Here we are swapping, that's the difference to #11
width = height;
height = tmp;
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
rawResult = multiFormatReader.decodeWithState(bitmap);
} catch (ReaderException re) {
// continue
} finally {
multiFormatReader.reset();
}
if (rawResult != null) {
long end = System.currentTimeMillis();
Log.d(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString());
Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);
Bundle bundle = new Bundle();
bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
message.setData(bundle);
//Log.d(TAG, "Sending decode succeeded message...");
message.sendToTarget();
} else {
Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
message.sendToTarget();
}
} 

当把camera上的图片转换成BinaryBitmap以后,剩下的事情,就更直接从图片识别是一样的。

PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

您可能感兴趣的文章:Android实现二维码扫描和生成的简单方法Android上使用ZXing识别条形码与二维码的方法iOS和Android用同一个二维码实现跳转下载链接的方法Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题Android项目实战(二十八):使用Zxing实现二维码及优化实例基于Android实现个性彩色好看的二维码Android基于google Zxing实现各类二维码扫描效果Android 二维码 生成和识别二维码 附源码下载Android编程实现二维码的生成与解析Android扫描和生成二维码


--结束END--

本文标题: Android平台生成二维码并实现扫描 &amp; 识别功能

本文链接: https://www.lsjlt.com/news/24864.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android studio 实现生成二维码和扫描二维码
    效果图 build.gradle(:app)添加依赖 dependencies { implementation 'com.google.zxing:core:3.3.3' imple...
    99+
    2023-09-30
    android studio android ide
  • Android中怎么实现二维码扫描功能
    这期内容当中小编将会给大家带来有关Android中怎么实现二维码扫描功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 开发准备1.1 android studio 安装&emsp;&e...
    99+
    2023-06-04
  • 基于barcodescanner实现Android二维码扫描功能
    二维码扫描现在成为一种非常常见的APP基础功能,附录1是我曾经用过的二维码/条形码扫描开源项目,但是附录1的项目集成和二次定制比较繁琐和麻烦,因此可以发现不少人基于ZXing做了二次的开发,并贡献出这些项目,发到github上,其中barc...
    99+
    2023-05-30
    android 二维码 barcodescanner
  • Angular.js实现扫码枪扫码并生成二维码
    目录前言扫码枪扫码生成二维码前言 举个例子: 商品都有自己的序列号 SN。那么当我们将这些商品打包的时候,我们就需要生成一份商品的 SN 清单,将其贴在箱子的表面以查看。但是冗长的...
    99+
    2023-03-08
    Angular.js生成二维码 Angular.js扫码枪扫码
  • jQuery如何实现二维码扫描功能
    这篇文章主要介绍了jQuery如何实现二维码扫描功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二维码:利用图形模拟二进制0、1的概念,达...
    99+
    2024-04-02
  • Angular.js如何实现扫码枪扫码并生成二维码
    这篇文章主要讲解了“Angular.js如何实现扫码枪扫码并生成二维码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular.js如何实现扫码枪扫码并生成二维码”吧!扫码枪扫码这个比较...
    99+
    2023-07-05
  • Android开发怎么实现模仿360二维码扫描功能
    小编给大家分享一下Android开发怎么实现模仿360二维码扫描功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:一、效果图:二、框架搭建首先,下载最新...
    99+
    2023-05-30
    android
  • Android中利用zxing实现自己的二维码扫描识别详解
    前言在上一篇文章中已经简单介绍了zxing的使用,快速集成到自己的项目中,但是使用的扫描我们没办法根据自己的需求来做自己的扫描界面,所以这篇我们来学习一下如何根据自己的需求来实现二维码的扫描。当然用到的库依然还是google的zxing。下...
    99+
    2023-05-30
    android zxing 二维码扫描识别
  • 如何使用HTML5实现二维码扫描功能
    本篇内容介绍了“如何使用HTML5实现二维码扫描功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   ...
    99+
    2024-04-02
  • 如何在 ASP 中实现二维码的生成与扫描?
    二维码已经成为了现代通信和支付的重要方式。在 ASP 中,生成和扫描二维码是一项非常有用的功能,可以应用于各种场景,例如电子支付、门禁管理、会员卡等等。本文将介绍如何在 ASP 中实现二维码的生成与扫描。 一、生成二维码 在 ASP 中,我...
    99+
    2023-10-25
    二维码 laravel 面试
  • Android 中怎么实现点击生成二维码功能
    这期内容当中小编将会给大家带来有关Android 中怎么实现点击生成二维码功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。QRCodeUtil:package com.example.admi...
    99+
    2023-05-30
    android
  • 使用微信小程序实现二维码扫描功能
    使用微信小程序实现二维码扫描功能随着移动互联网的快速发展,二维码已经成为了一种非常方便的信息交互方式。微信小程序作为一种新的应用形式,也提供了二维码扫描功能。本文将介绍如何使用微信小程序实现二维码扫描,并提供具体的代码示例。一、准备工作在开...
    99+
    2023-11-21
    二维码 微信小程序 扫描
  • 如何使用Java对象实现二维码扫描功能?
    在现代社会中,二维码已经成为了一种非常重要的信息传递方式。二维码的使用范围非常广泛,包括支付、物流、广告等多个领域。因此,如何使用Java对象实现二维码扫描功能是非常重要的。本文将介绍如何使用Java对象实现二维码扫描功能,并附带演示代码。...
    99+
    2023-09-18
    二维码 开发技术 对象
  • java实现识别二维码图片功能
    本文实例为大家分享了java实现识别二维码图片功能,供大家参考,具体内容如下 所需maven依赖 <dependency>    <groupId>com.g...
    99+
    2024-04-02
  • 利用Android怎么实现一个二维码生成功能
    利用Android怎么实现一个二维码生成功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在project的build.gradle添加如下代码:allproj...
    99+
    2023-05-31
    android roi
  • ASP中如何实现二维码生成与识别?
    随着二维码的广泛应用,二维码的生成和识别已经成为很多应用场景中必不可少的功能。在ASP中实现二维码的生成和识别也变得越来越重要。本文将介绍如何使用ASP实现二维码的生成和识别,并给出相应的代码示例。 一、二维码的生成 安装二维码生成工具...
    99+
    2023-09-24
    二维码 bash numpy
  • java微信扫描公众号二维码实现登陆功能
    本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下前提条件: 微信公众平台为服务号, 2.服务号实现了账号绑定功能,即将open_id 与业务系统中的用户名有对应关系具体实现原理: 用户访问业务系统...
    99+
    2023-05-31
    java 二维码
  • Android实现生成二维码并保存到相册
    效果图如下 保存的图片效果是: 保存到本地的,是整个视图,不只是单单的二维码的图片, 在了解的一番过程之后,我知道了, 1.首先要去获取保存图片的写入权限;(使用 https:/...
    99+
    2024-04-02
  • Java中怎么实现生成二维码功能
    今天就跟大家聊聊有关Java中怎么实现生成二维码功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。maven依赖<!--生成二维码-->  <d...
    99+
    2023-06-15
  • Qt实现字符串生成二维码功能
    目录前言开发环境实现步骤资源包数据配置属性二维码操作总结前言 最近在整理开发项目中遇到的知识点,发现了一个特别有意思的功能:使用字符串生成二维码操作。 下面是实现的效果图 开发环境...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作