基于react-native-camera限定区域扫描

前言

目前,有很多扫描的轮子,今天来说说react-native-camera库的扫描应用

集成

集成方式传送门,这次不说这部分内容. 主要说说怎么限定区域扫描. (如果有同学在这部分遇到问题可以留言互相交流)

限定区域

react-native-camera库并没有暴露出限定区域范围的属性,所以需要我们去修改源代码,
iOS中,利用原生扫描机制AVCaptureMetadataOutput来实现扫描识别功能,
首先找到RNCamera类


1.png

然后修改限制区域方法:

       [[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureInputPortFormatDescriptionDidChangeNotification
                                                          object:nil
                                                           queue:nil
                                                      usingBlock: ^(NSNotification *_Nonnull note) {
                                                          dispatch_async(self.sessionQueue, ^{
                                                              self.metadataOutput.rectOfInterest = CGRectMake(0.25, 0.25, 0.5, 0.5);
                                                          });

                                                      }];

即可完成修改扫描位置在屏幕中心.

坑点1

rectOfInterest参数顺序为(x, y, h, w), 且都是按比例分配

坑点2

必须在AVCaptureInputPortFormatDescriptionDidChangeNotification通知中回调, 设置区域才有效

坑点3

设置metadataOutput的rectOfInterest时, 需要添加线程异步处理, 请测不然RN上页面会有几秒钟卡顿

RN代码中写法

        <RNCamera
          style={{ flex: 1 }}
          ref={ref => {
            this.camera = ref;
          }}
          type={RNCamera.Constants.Type.back}
          barCodeTypes={[RNCamera.Constants.BarCodeType.qr]}
          flashMode={RNCamera.Constants.FlashMode.auto}
          onBarCodeRead={() => {
            // method
          }}
        />

如果需要添加扫描框与扫描线,代码如下
利用Animated动画实现即可, 关键代码如下, 需要在componentDidMount下启动动画, 且训话调用即可

<Animated.View
              style={[
                {
                  width,
                  backgroundColor: '#00ff00',
                  height: 2,
                },
                { transform: [{ translateY: this.state.move }] },
              ]}
            />

android限制扫描区域

文件所在位置:


1.png

实现居中扫描效果:

private BinaryBitmap generateBitmapFromImageData(byte[] imageData, int width, int height) {
    int scW = width / 2;
    int left =(width - scW) / 2;
    int top =(height - scW) / 2;
    PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
        imageData, // byte[] yuvData
        width, // int dataWidth
        height, // int dataHeight
            left, // int left
            top, // int top
            scW, // int width
            scW, // int height
        false // boolean reverseHorizontal
    );
    return new BinaryBitmap(new HybridBinarizer(source));
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,659评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 13,134评论 2 59
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,032评论 3 119
  • 学素描的第九天 加油
    三维日记阅读 183评论 0 0
  • 设置position属性值为 absolute 会将对象拖离出正常的文档流绝对定位,而不考虑它周围内容的布局。假如...
    晓函阅读 460评论 0 0