Android的解析二维码图片实例

来源:互联网 发布:试君眼力知多少 编辑:程序博客网 时间:2024/05/16 19:00

1

解析核心代码

public void decodeQRCode(){//Map<DecodeHintType, String> hints = new HashMap<DecodeHintType, String>();//hints.put(DecodeHintType.CHARACTER_SET, "utf-8");//HashMap<DecodeHintType, String> hints = new HashMap<DecodeHintType, String>();//hints.put(DecodeHintType.CHARACTER_SET, "utf-8");Hashtable<DecodeHintType, String> tab = new Hashtable<DecodeHintType, String>();tab.put(DecodeHintType.CHARACTER_SET, "utf-8");Bitmap bitmap = ((BitmapDrawable) mark.getDrawable()).getBitmap();RGBLuminanceSource source = new RGBLuminanceSource(bitmap);// 转成二进制图片BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));// 实例化二维码解码对象QRCodeReader reader = new QRCodeReader();Result result;try {// 根据解码类型解码,返回解码结果result = reader.decode(bitmap1, tab);//result = reader.decode(bitmap1, hints);System.out.println("res:》》》》》》》:" + result.getText());// 显示解码结果qr_result.setText(result.getText());} catch (NotFoundException e) {e.printStackTrace();} catch (ChecksumException e) {e.printStackTrace();} catch (FormatException e) {e.printStackTrace();}}
2 中途要用到的一个类 
RGBLuminanceSource


/* * Copyright 2009 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.d;import java.io.FileNotFoundException;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import com.google.zxing.LuminanceSource;/** * This class is used to help decode images from files which arrive as RGB data * from Android bitmaps. It does not support cropping or rotation. *  * @author dswitkin@google.com (Daniel Switkin) */public final class RGBLuminanceSource extends LuminanceSource {private final byte[] luminances;public RGBLuminanceSource(String path) throws FileNotFoundException {this(loadBitmap(path));}public RGBLuminanceSource(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);}}}}@Overridepublic 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.@Overridepublic 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;}}

3 效果图 以一个搜狐的一个二维码为例子

刚刚打开



点击解析QR图 后的效果 最下一行变成了 搜狐ip地址


原创粉丝点击