• andorid jar/库源码解析之zxing


    目录: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:识别条形码。(反向解析)

      源码:https://github.com/zxing/zxing

      引入:

    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'}
      
  • 相关阅读:
    从OpenShift SDN切换到OVNKubernetes
    OpenShift 4.10环境中的Multus静态ip
    NGINX配置显示目录文件列表
    aria2 使用openclash代理
    证书服务(五)windowsCA中心
    python操作excel
    openwrt nginx 配置PHP
    证书服务(二)加密通信的进化
    docker nginx 使用变量
    Python win32com xls文件和xlsx文件格式互相转换
  • 原文地址:https://www.cnblogs.com/Supperlitt/p/12782875.html
Copyright © 2020-2023  润新知