2017-12-05 10 views
0

これはgoogle vision APIに関するものです。 CameraPreviewは全画面でうまく動作します。しかし、ボックス内でカメラをプレビューすると、画像がゆがんで表示されます。setPreviewSizeやPictureSizeなどのCameraSourceサイズを変更するには

これは私が使用したコードです。私の問題は、プレビューがボックスをいっぱいにするが、プレビューが伸びて、私はcameraPreviewのサイズを調整することができないということです。変数CameraPreviewはSurfaceView型です。私はCameraSourceを使ってプレビューを開始します。 CameraPreview(SurfaceView)のサイズを変更し、プレビューのクロップをボックスに合わせる方法はありますか?

cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() { 
      protected List<Camera.Size> mPreviewSizeList; 
      protected List<Camera.Size> mPictureSizeList; 
      protected Camera.Size mPreviewSize; 
      protected Camera.Size mPictureSize; 
      protected boolean mSurfaceChanged = false; 
      private int mSurfaceChangedCallDepth = 0; 
      private int mCenterPosX = -1; 
      private int mCenterPosY = 0; 
      @Override 
      public void surfaceCreated(SurfaceHolder surfaceHolder) { 
       if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
        ActivityCompat.requestPermissions(ClientIdScannerActivity.this, 
          new String[]{Manifest.permission.CAMERA}, RequestCameraPermissionId); 
        Toast.makeText(ClientIdScannerActivity.this, "The App requires this permission", Toast.LENGTH_SHORT).show(); 
        return; 
       } 
       try { 
        cameraSource.start(cameraPreview.getHolder()); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
      @Override 
      public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 
       mSurfaceChangedCallDepth++; 

      /* cameraSource.stop(); 

       Camera.Parameters cameraParams = mCamera.getParameters(); 

       if (!mSurfaceChanged) { 
        Camera.Size previewSize = determinePreviewSize(cameraWidth, cameraHight); 
        Camera.Size pictureSize = determinePictureSize(previewSize); 
        mPreviewSize = previewSize; 
        mPictureSize = pictureSize; 
        mSurfaceChanged = adjustSurfaceLayoutSize(previewSize,i1, i2); 

        if (mSurfaceChanged && (mSurfaceChangedCallDepth <= 1)) { 
         return; 
        } 
       } 

       cameraParams.setRotation(270); 
       if (UtilFunctions.isTablet()) { 
       } else { 
        mCamera.setDisplayOrientation(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? 270 : 90); 
       }*/ 

//   cameraParams.setRotation(270); 
//   mCamera.setDisplayOrientation(UtilFunctions.isTablet() ? 90 : 270); 

       /* cameraParams.set("orientation", "portrait"); 
       // cameraParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
       cameraParams.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
       cameraParams.setPictureSize(mPictureSize.width, mPictureSize.height); 
       if (cameraParams.getSupportedFocusModes().contains(
         Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { 
        cameraParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
       }*/ 

       mSurfaceChanged = false; 

       try { 
        if (ActivityCompat.checkSelfPermission(ClientIdScannerActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
         // TODO: Consider calling 
         // ActivityCompat#requestPermissions 
         // here to request the missing permissions, and then overriding 
         // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
         //           int[] grantResults) 
         // to handle the case where the user grants the permission. See the documentation 
         // for ActivityCompat#requestPermissions for more details. 
         Toast.makeText(ClientIdScannerActivity.this, "App requires Camera permission to scan ID", Toast.LENGTH_SHORT).show(); 
         return; 
        } 
        cameraSource.start(cameraPreview.getHolder()); 
       } catch (Exception e) { 
        // Remove failed size 

        // Reconfigure 
        if (mPreviewSizeList.size() > 0) { // prevent infinite loop 
         surfaceChanged(null, 0, i1, i2); 
        } else { 
//    Utils.showToast(CameraNewActivity.this, "Can't start preview", Toast.LENGTH_LONG); 
        } 
       } 

       mSurfaceChangedCallDepth--; 
      } 

      protected Camera.Size determinePreviewSize(int reqWidth, int reqHeight) { 

       int reqPreviewWidth = 640;//reqHeight; // requested width in terms of camera hardware 
       int reqPreviewHeight = 480;// reqWidth; // requested height in terms of camera hardware 
       Camera.Size retSize = null; 
       for (Camera.Size size : mPreviewSizeList) { 
        if (size.width == reqPreviewWidth && size.height == reqPreviewHeight) { 
         retSize = size; 
        } 
       } 
       // retSize = mPreviewSizeList.get(mPreviewSizeList.size()-1); 
       return retSize; 
      } 

      protected Camera.Size determinePictureSize(Camera.Size previewSize) { 
       Camera.Size retSize = null; 
       for (Camera.Size size : mPictureSizeList) { 
        if (size.equals(previewSize)) { 
         return size; 
        } 
       } 

       // if the preview size is not supported as a picture size 
       float reqRatio = ((float) previewSize.width)/previewSize.height; 
       float curRatio, deltaRatio; 
       float deltaRatioMin = Float.MAX_VALUE; 
       for (Camera.Size size : mPictureSizeList) { 
        curRatio = ((float) size.width)/size.height; 
        deltaRatio = Math.abs(reqRatio - curRatio); 
        if (deltaRatio < deltaRatioMin) { 
         deltaRatioMin = deltaRatio; 
         retSize = size; 
        } 
       } 

       return retSize; 
      } 

      protected boolean adjustSurfaceLayoutSize(Camera.Size previewSize, 
                 int availableWidth, int availableHeight) { 

       float tmpLayoutHeight = previewSize.width; 
       float tmpLayoutWidth = previewSize.height; 

       float factH, factW, fact; 
       factH = availableHeight/tmpLayoutHeight; 
       factW = availableWidth/tmpLayoutWidth; 

//  if (factH < factW) { 
//   fact = factH; 
//  } else { 
       fact = factW; 
       // } 

       FrameLayout.LayoutParams layoutParams =(FrameLayout.LayoutParams) cameraPreview.getLayoutParams(); 
       int layoutHeight = (int) (tmpLayoutHeight * fact); 
       int layoutWidth = (int) (tmpLayoutWidth * fact); 

       boolean layoutChanged; 
       if ((layoutWidth != cameraPreview.getWidth()) || (layoutHeight != cameraPreview.getHeight())) { 
        layoutParams.height = layoutHeight; 
        layoutParams.width = layoutWidth; 
        if (mCenterPosX >= 0) { 
         layoutParams.topMargin = mCenterPosY - (layoutHeight/2); 
         layoutParams.leftMargin = mCenterPosX - (layoutWidth/2); 
        } 
        cameraPreview.setLayoutParams(layoutParams); // this will trigger another surfaceChanged invocation. 
        layoutChanged = true; 
       } else { 
        layoutChanged = false; 
       } 

       return layoutChanged; 
      } 

      @Override 
      public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
       cameraSource.stop(); 
      } 
     }); 
+0

このコードは実行されますが、効果はありません。以前はCamera変数を使用していましたが、それ以上は必要ないのでコメントしました。それは私の理解です。 –

答えて

0

同じ問題が「フルスクリーン」カメラのプレビューのために存在することに注意してください。選択したプレビューサイズのアスペクト比が画面のアスペクト比に十分近づくという保証はありません。詳細はこちらをご覧ください:Camera Preview Stretched on Few Android Devices

ビューに合わせて最適な幅と高さを選択する必要がありますが、これでは不十分です。不透明なビューの背後にあるプレビューサーフェスの「ぶら下がっている」部分を隠す必要があります。例えば、あなたができる方法を参照してくださいmake a circular preview

ここでもう1つ重要なことは、プレビューとピクチャサイズを常に同期させておくことです。これは同じでなければならないわけではありませんが、アスペクト比はすべきです。一部のデバイスでは、写真をキャプチャするために縦横比が変更されたときに奇妙な効果があります。

+0

ありがとうございました! –

関連する問題