• zxing全屏识别(v2.5.0崩溃问题记录)


    自己遇到的问题:/**

       * Like {@link #getFramingRect} but coordinates are in terms of the preview frame,
       * not UI / screen.
       */
      public Rect getFramingRectInPreview() {
        if (framingRectInPreview == null) {
          Rect rect = new Rect(getFramingRect());
          Point cameraResolution = configManager.getCameraResolution();
          Point screenResolution = configManager.getScreenResolution();
          // rect.left = rect.left * cameraResolution.x / screenResolution.x;
          // rect.right = rect.right * cameraResolution.x / screenResolution.x;
          // rect.top = rect.top * cameraResolution.y / screenResolution.y;
          // rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
    
    
          /*rect.left = rect.left * cameraResolution.y / screenResolution.x;
          rect.right = rect.right * cameraResolution.y / screenResolution.x;
          rect.top = rect.top * cameraResolution.x / screenResolution.y;
          rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;*/
          /***lyl  TODO 修改识别区域为全屏***/
        //自己傻乎乎的把这里的参数改了以后,在自己跟部分手机上运行,识别,都可以实现全屏识别。但是没想到发版本后,好多手机都出现了崩溃问题。
        
    rect.left = 0; rect.right =screenResolution.x; rect.top = 0; rect.bottom =screenResolution.y; framingRectInPreview = rect; } return framingRectInPreview; }

    出错的位置是:

      /**
       * A factory method to build the appropriate LuminanceSource object based on the format
       * of the preview buffers, as described by Camera.Parameters.
       *
       * @param data A preview frame.
       * @param width The width of the image.
       * @param height The height of the image.
       * @return A PlanarYUVLuminanceSource instance.
       */
      public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
        Rect rect = getFramingRectInPreview();
        int previewFormat = configManager.getPreviewFormat();
        String previewFormatString = configManager.getPreviewFormatString();
        switch (previewFormat) {
          // This is the standard Android format which all devices are REQUIRED to support.
          // In theory, it's the only one we should ever care about.
          case PixelFormat.YCbCr_420_SP:
            // This format has never been seen in the wild, but is compatible as we only care
            // about the Y channel, so allow it.
          case PixelFormat.YCbCr_422_SP:
            return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
                    rect.width(), rect.height());
          default:
            // The Samsung Moment incorrectly uses this variant instead of the 'sp' version.
            // Fortunately, it too has all the Y data up front, so we can read it.
            if ("yuv420p".equals(previewFormatString)) {
              return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top,
                      rect.width(), rect.height());
            }
        }
        throw new IllegalArgumentException("Unsupported picture format: " +
                previewFormat + '/' + previewFormatString);
      }
     public PlanarYUVLuminanceSource(byte[] yuvData, int dataWidth, int dataHeight, int left, int top,
          int width, int height) {
        super(width, height);
      //报错的是这里。
        if (left + width > dataWidth || top + height > dataHeight) {
          throw new IllegalArgumentException("Crop rectangle does not fit within image data.");
        }
    
        this.yuvData = yuvData;
        this.dataWidth = dataWidth;
        this.dataHeight = dataHeight;
        this.left = left;
        this.top = top;
      }

    原文链接:https://blog.csdn.net/yu_duan_hun/article/details/79388195

    1.删除bundle传bitmap的部分直接改为全屏识别


    (1)全屏扫样式更改 
    CameraManager.java 
    需要更改buildLuminanceSource()方法:

     public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
        return new PlanarYUVLuminanceSource(data, width, height, 0, 0,
                width, height);
                }

    ViewfinderView.java 
    需要更改onDraw():

    public void onDraw(Canvas canvas) {
        postInvalidateDelayed(ANIMATION_DELAY, 0, 0,
                    getWidth(), getHeight());
    }

    (2)去掉传递图片(一般只需要扫码的条码号或者网址,扫码图片本身我们不关心,如果需要这部分需要对这个图片进行压缩处理,不然会出错)

    MipActivityCapture.java 
    这里需要删掉handleDecode里面的bundle.putParcelable("bitmap", barcode);,barcode这个参数也可以不用传递了。 
    相应的在CaptureActivityHandler.java的handleMessage中只需要传递msg.obj,下面这句可以删掉:

     Bitmap barcode = bundle == null ? null :
                (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);

    然后把DecodeHandler.java的decode()方法也改一下: 

    删掉下面的部分

      Bundle bundle = new Bundle();
          bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
          message.setData(bundle);
  • 相关阅读:
    POJ 1094 (传递闭包 + 拓扑排序)
    POJ 2594 (传递闭包 + 最小路径覆盖)
    POJ 3041 Asteroids(二分图最大匹配)
    差分数组原理与其前缀和的应用
    树状数组的理解以及简单应用
    HDU 4635 (完全图 和 有向图缩点)
    2.基本数据类型
    Python基础
    数据库类型
    Vue-2
  • 原文地址:https://www.cnblogs.com/liyanli-mu640065/p/9176132.html
Copyright © 2020-2023  润新知