// ZXing二维码库(推荐)
implementation 'com.journeyapps:zxing-android-embedded:3.4.0'

实例1-从图片中读取二维码集合(我的实例)

按键事件-调用

    public void a3_bt_test_QRCode(){

        List<String> listcodes = new ArrayList<>();
        List<String> listcodesMax = new ArrayList<>();

        bitmap = mSurfaceView.readPicture(img_big0);   //获取图片
        myOpenCV.showImage(bitmap,img_big0);           //图片显示(作直观参照)

        Log.e(TAG, "-------------------------旋转图片,多次识别二维码");
        for(int i = 0; i <= 10; i++){

            int angle = i * 30;

            Matrix matrix = new Matrix();
            matrix.postRotate(angle);
            Bitmap b = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            listcodes = myOpenCV.readQRCoders(b); //识别二维码
            if(listcodesMax.size() < listcodes.size())listcodesMax = listcodes;  //把获取最多二维码 收藏记录
            if(listcodes.size() >= 3)break;   //获取我们要求的3个二维码时,跳出
        }
        
        Log.e(TAG, "辨别二维码 个数= "+ listcodesMax.size());
        for (int i = 0;i<listcodesMax.size();i++){

            Log.e(TAG, "二维码 : "+ i + " "+listcodesMax.get(i) );
        }
    }
 public List<String> readQRCoders(Bitmap bitmap){

        //二维码识别
        List<String> listcodes=new ArrayList<>();
        String msg ="";

        // 将Bitmap转换为ZXing可识别的格式
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int[] pixels = new int[width * height];
        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

        RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));

        // 使用QRCodeMultiReader可以识别多个二维码
        try{
            QRCodeMultiReader reader = new QRCodeMultiReader();
            Result[] results = reader.decodeMultiple(binaryBitmap);

            if (results != null && results.length > 0) {

                for (int i = 0; i < results.length; i++) {

                    listcodes.add(results[i].getText());
                    Log.e(TAG, "二维码 = "+ results[i].getText());
                }
            } else {msg =  "未识别到二维码";}

        } catch (NotFoundException e) {msg = "异常错误1-未找到二维码 " + e;
        } catch (Exception e)         {msg = "异常错误2-识别失败 " + e;}

        Log.e(TAG, "readQRCoder: "+ msg);
        return listcodes;
    }

实例2-从图片中读取单个二维码(我的实例)

 //===============================================================二维码识别
    public List<String> readQRCoderFormSingleCard(Bitmap bitmapSrc){

        String msg = "";
        List<String> list = new ArrayList<>();

        for(int i = 0; i <= 10; i++){

            int angle = i * 30;              //图片旋转
            Matrix matrix = new Matrix();
            matrix.postRotate(angle);
            Bitmap bp = Bitmap.createBitmap(bitmapSrc, 0, 0, bitmapSrc.getWidth(), bitmapSrc.getHeight(), matrix, true);

            //二维码识别  将Bitmap转换为ZXing可识别的格式
            int width = bp.getWidth();
            int height = bp.getHeight();
            int[] pixels = new int[width * height];
            bp.getPixels(pixels, 0, width, 0, 0, width, height);

            RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));

            // 使用QRCodeMultiReader可以识别多个二维码
            try{
                QRCodeMultiReader reader = new QRCodeMultiReader();
                Result[] results = reader.decodeMultiple(binaryBitmap);

                if (results != null && results.length > 0) {

                    for (int k = 0; k < results.length; k++) {

                        list.add(results[k].getText());
                        //Log.e(TAG, "二维码  k = "+ k +" "+ results[k].getText());
                    }

                }else{msg =  "err-未识别到二维码";}

            } catch (NotFoundException e) {msg = "err-异常错误1-未找到二维码 " + e;
            } catch (Exception e)         {msg = "err-异常错误2-识别失败 " + e;}

            if(list.size() > 0)break;// Log.e(TAG, ""+ msg);
        }
        return list;
    }

持续更新

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐