欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

andorid jar/库源码解析之zxing

程序员文章站 2022-07-09 19:17:13
目录:andorid jar/库源码解析 Zxing: 作用: 生成和识别,二维码,条形码。 栗子: 生成二维码,赋值到ImageView上 QRCodeWriter qrCodeWriter = new QRCodeWriter(); Map hin ......

目录:andorid jar/库源码解析 

zxing:

  作用:

    生成和识别,二维码,条形码。

  栗子:

   生成二维码,赋值到imageview上

     qrcodewriter qrcodewriter = new qrcodewriter();
        map<encodehinttype, string> hints = new hashmap<>();
        hints.put(encodehinttype.character_set, "utf-8"); //记得要自定义长宽
        bitmatrix encode = null;
        try {
            encode = qrcodewriter.encode("hello,world!", barcodeformat.qr_code, width, height, hints);
        } catch (writerexception e) {
            e.printstacktrace();
        }
        int[] colors = new int[width * height];
        //利用for循环将要表示的信息写出来
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                if (encode.get(i, j)) {
                    colors[i * width + j] = color.black;
                } else {
                    colors[i * width + j] = color.white;
                }
            }
        }

        bitmap bit = bitmap.createbitmap(colors, width, height, bitmap.config.rgb_565);
        imageview.setimagebitmap(bit);

  生成条形码,赋值到imageview上

     final int white = 0xffffffff;
        final int black = 0xff000000;
        multiformatwriter writer = new multiformatwriter();
        bitmatrix result = null;
        try {
            barcodeformat barcodeformat = barcodeformat.code_128;
            result = writer.encode("1234567123456", barcodeformat, 400,
                    100, null);
        } catch (writerexception e) {
            // todo auto-generated catch block
            e.printstacktrace();
        }

        int width = result.getwidth();
        int height = result.getheight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = result.get(x, y) ? black : white;
            }
        }

        bitmap bitmap = bitmap.createbitmap(width, height,
                bitmap.config.argb_8888);
        bitmap.setpixels(pixels, 0, width, 0, 0, width, height);

        imageview2.setimagebitmap(bitmap);

  识别二维码

   private void test3() {
        recogqrcode(imageview);
    }

    public void recogqrcode(imageview imageview){
        bitmap qrbmp = ((bitmapdrawable) (imageview).getdrawable()).getbitmap();   //将图片bitmap化
        int width = qrbmp.getwidth();
        int height = qrbmp.getheight();
        int[] data = new int[width * height];
        qrbmp.getpixels(data, 0, width, 0, 0, width, height);    //得到像素
        rgbluminancesource source = new rgbluminancesource(width, height, data);
        binarybitmap bitmap1 = new binarybitmap(new hybridbinarizer(source));
        qrcodereader reader = new qrcodereader();
        result re = null;
        try {
            //得到结果
            re = reader.decode(bitmap1);
        } catch (notfoundexception e) {
            e.printstacktrace();
        } catch (checksumexception e) {
            e.printstacktrace();
        } catch (formatexception e) {
            e.printstacktrace();
        }

        lblmsg1.settext(re.gettext());
    }

  识别条形码

     bitmap qrbmp = ((bitmapdrawable) (imageview2).getdrawable()).getbitmap();   //将图片bitmap化
        int width = qrbmp.getwidth();
        int height = qrbmp.getheight();
        int[] data = new int[width * height];
        qrbmp.getpixels(data, 0, width, 0, 0, width, height);    //得到像素
        rgbluminancesource source = new rgbluminancesource(width, height, data);

        //二进制图片转换成bitmap对象(说明:创建hybridbinarizer对象,需要传入luminancesource,所以传入source(二进制的图片),并且通过binarybitmap转换成bitmap对象)
        binarybitmap bitmap1 = new binarybitmap(new hybridbinarizer(source));
        //codabarreader codabarreader= new codabarreader();    //codabarreader  二维码
        try {
            //multiformatreader是读取图像的类(在core包)
            result result = new multiformatreader().decode(bitmap1);      //识别条形码,和二维码(说明:获取到我们需要的信息)
            lblmsg2.settext(result.gettext());
        } catch (notfoundexception e) {
            e.printstacktrace();
            lblmsg2.settext("ex " + e.getmessage());
        }

  源码解读:

  a:生成二维码

    1、创建一个 qrcodewriter对象,调用 encode,传入需要生成二维码的数据,格式化参数,大小,和编码信息

    2、调用encoder的encode方法,a,确定当前使用的编码。b,判断生成二维码数据的编码模式(数字,byte,和 0x00-0x5f)。c,附加eci部分(二维码格式中的一部分)。d,填充 fnc1信息到头部中。e,写入模式标记到头部中。

    3、把二维码文本数据,按照不同的模式,写入到不同的结果bit集合中。

    4、判断版本和容量,是否在范围内。

    5、合并头部,数据长度,数据内容到一个bit集合。

    6、填充数据,使bit数据时8的整数倍。

    7、把位数据信息和纠错码,交织在一起,存入新的数据(算法复杂,具体参考二维码生成算法)。

    8、调用 matrixutil.buildmatrix,构建二维码矩阵,并返回二维码信息。 qrcode中 使用 bytematrix 存储矩阵,内部是一个二维的bytes数组。 private final byte[][] bytes;

    9、转换矩阵颜色,从 输入矩阵使用0==白色,1==黑色,而输出矩阵使用 0==黑色,255==白色(即8位灰度位图)。

    10、创建一个color数组,把颜色数据存入。调用   bitmap.createbitmap ,把color集合信息,传递给他,然后返回一个bitmap就是二维码数据了。

  b:生成条形码

    1、创建一个 multiformatwriter 对象,并调用他的 encode方法,传入条形码数据,和编码信息,和条形码结果大小。

    2、根据不同的编码,选择了不同的写入器,这里采用了 code128writer

    3、a,判断条形码内容,长度限制[1,80]。...略

    4、使用二进制,把二进制转换成图片。就是最后的结果了。。

  c:识别二维码。(反向解析)

  d:识别条形码。(反向解析)

  源码:

  引入:

api 'com.google.zxing:android-core:3.3.0'
api 'com.google.zxing:core:3.3.2'

  注意:(如果无法从google加载,就需要换一个来源,下面代码和图)

maven{ url'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
  andorid jar/库源码解析之zxing