Android 使用ZXing库识别图片上的二维码:
1. EncodingHandler.java 文件:
public final class EncodingHandler { private static final int BLACK = 0xff000000; public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException { Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight); int width = matrix.getWidth(); int height = matrix.getHeight(); int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (matrix.get(x, y)) { pixels[y * width + x] = BLACK; } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } }
2. RGBLuminanceSource 类继承ZXing库中的LuminanceSource类:
public class RGBLuminanceSource extends LuminanceSource { private final byte[] luminances; private final int dataWidth; private final int dataHeight; private final int left; private final int top; public RGBLuminanceSource(Bitmap bitmap) { super(bitmap.getWidth(), bitmap.getHeight()); // TODO Auto-generated constructor stub int width = bitmap.getWidth(); int height = bitmap.getHeight(); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); dataWidth = width; dataHeight = height; left = 0; top = 0; // 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[] getMatrix() { // TODO Auto-generated method stub int width = getWidth(); int height = getHeight(); // If the caller asks for the entire underlying image, save the copy and give them the // original data. The docs specifically warn that result.length must be ignored. if (width == dataWidth && height == dataHeight) { return luminances; } int area = width * height; byte[] matrix = new byte[area]; int inputOffset = top * dataWidth + left; // If the width matches the full width of the underlying data, perform a single copy. if (width == dataWidth) { System.arraycopy(luminances, inputOffset, matrix, 0, area); return matrix; } // Otherwise copy one cropped row at a time. byte[] rgb = luminances; for (int y = 0; y < height; y++) { int outputOffset = y * width; System.arraycopy(rgb, inputOffset, matrix, outputOffset, width); inputOffset += dataWidth; } return matrix; } @Override public byte[] getRow(int y, byte[] row) { // TODO Auto-generated method stub 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]; } int offset = (y + top) * dataWidth + left; System.arraycopy(luminances, offset, row, 0, width); return row; } }
2,识别图片二维码的代码:
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>(); hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); // 设置二维码内容的编码 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 先获取原大小 Bitmap scanBitmap = BitmapFactory.decodeFile("/mnt/sdcard/temp_QRCode.png", options); options.inJustDecodeBounds = false; // 获取新的大小 int sampleSize = (int) (options.outHeight / (float) 200); if (sampleSize <= 0) sampleSize = 1; options.inSampleSize = sampleSize; scanBitmap = BitmapFactory.decodeFile("/mnt/sdcard/temp_QRCode.png", options); RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap); BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source)); QRCodeReader reader = new QRCodeReader(); try { Result result = reader.decode(bitmap1, hints); if (result != null) { String data = result.toString(); Toast.makeText(MainActivity.this, "Data= " + data, Toast.LENGTH_LONG).show(); } } catch (NotFoundException e) { e.printStackTrace(); } catch (ChecksumException e) { e.printStackTrace(); } catch (FormatException e) { e.printStackTrace(); }
相关推荐
Android使用Zxing库识别多个二维码
在Android开发中,二维码扫描和识别相册图片中的二维码是一项常用功能,这使得用户能够方便地从图片中获取隐藏的信息,如网址、联系人信息、文本等。在本项目"saomademo"中,我们将深入探讨如何实现这一功能,并讨论...
本文将详细讲解如何实现"Android Webview长按识别二维码"的功能。 首先,我们需要了解两个关键概念:Webview和二维码识别。Webview是Android SDK提供的一种用于在应用内部显示网页的控件,它可以处理JavaScript、...
在Android平台上,二维码识别是一项常见的功能,用于读取和解析...通过以上步骤,你就能实现在Android应用中成功识别二维码的功能。在开发过程中,注意兼容不同设备的相机配置和性能,以确保在各种设备上都能稳定运行。
本项目"Android 二维码扫描 长按二维码识别 相册识别 状态栏颜色设置"聚焦于如何在Android应用中实现二维码扫描,并提供了一些额外的特性,如长按识别和相册选择识别。下面将详细介绍这些功能的实现方法。 首先,...
Android利用zxing生成二维码,识别二维码超详细、超简易demo,解压后用Android studio可直接打开,附教程:https://blog.csdn.net/mountain_hua/article/details/80646089
Android实现二维码扫描功能(四)-ZXing识别图片二维码,从相册中选择图片并识别图中二维码,详见:http://blog.csdn.net/ahuyangdong/article/details/77487650,持续更新的版本:...最新的lib版本:...
Android利用zxing用相机识别二维码,以及识别本地图片二维码,解压后用Android可直接打开,附教程:https://blog.csdn.net/mountain_hua/article/details/80699778
基于google Zxing实现二维码的生成,识别和长按识别的效果,仿微信选择相册里的二维码图片直接识别的效果 ,选择相册在主页面点击打开摄像机进行扫描,进入扫描页面,在里面有选择相册的选项,直接点击就可以调用...
在Android开发中,ZXing(Zebra ...通过自定义扫描界面、从相册选取图片识别二维码以及处理权限和设备差异,你可以构建出一个完整的二维码扫描功能。在实际开发中,记得时刻关注库的更新,以便利用最新的特性和修复。
3. **Delphi二维码**:指的是使用Delphi开发的二维码相关功能,包括生成和识别二维码,这是跨平台应用程序开发的一个重要组成部分。 4. **二维码识别**:是技术手段,用于自动解析和提取二维码中的信息,通常涉及...
本教程将详细介绍如何在Android应用中使用ZBar进行条码和二维码的扫描及图片解析。 首先,要集成ZBar,你需要在项目中添加ZBar的依赖。如果是使用Gradle构建系统,可以在`build.gradle`文件的`dependencies`块中...
在Android平台上进行条形码和二维码的识别与生成,ZXing库是一个不可或缺的工具。ZXing,全称为“Zebra Crossing”,是一个开源项目,提供了多种平台的条码处理能力,包括读取、生成以及解析。在Android应用开发中,...
Zxing库包含多种解码器,其中QRCodeReader或MultiFormatReader可以用来识别二维码。在我们的场景中,我们需要创建多个实例,分别对应四个子区域,然后调用decode()方法对每个子区域的数据进行解码。注意,可能需要...
Android利用zxing用相机识别二维码,打开闪光灯,以及识别本地图片二维码,解压后用Android可直接打开。附教程:https://blog.csdn.net/mountain_hua/article/details/80699778
二维码识别-使用opencv在Android上开发的微信二维码识别项目源码+演示apk+详细使用说明.zip二维码识别-使用opencv在Android上开发的微信二维码识别项目源码+演示apk+详细使用说明.zip二维码识别-使用opencv在Android...
使用Zxing,我们需要创建一个扫描器,通过捕获设备摄像头的实时画面来识别二维码。这个过程涉及相机权限的申请、预览配置、帧数据处理等步骤。通过SurfaceView或TextureView来显示摄像头预览,并将每一帧数据传递给...
在Android平台上,二维码扫描是一项常见的功能,用于读取和解析包含信息的二维码图像。这个话题主要涉及如何在Android应用中实现对本地图片的二维码扫描,以及如何处理扫描结果。以下是一份详细的Android本地二维码...
在Android平台上,生成...总结来说,Android上生成二维码和识别二维码主要依赖于Zxing库和Google的`BarcodeDetector`服务。开发者可以根据项目需求选择合适的库,并进行适当定制,以满足特定场景下的功能和性能要求。