CaptureRequest.SCALER_CROP_REGION-想要放大特定区域-camera2

时间:2019-02-15 10:10:07

标签: android-camera2

基于Camera2Basic程序代码,我想放大预览图像拐角处的特定区域。

在F-05J(Android7.1)上,裁剪区域始终围绕预览图像的中心。 我想知道为什么。

我的缩放程序很容易在预览图像的中心周围工作。 我在我的TextureView侦听器的onTouch回调中应用了一些确定的参数,以便了解缩放的方式和位置。

在Nexus 5X上,它似乎在拐角处放大,但是裁剪区域的原始点似乎在旋转的水平矩形的右下角。我希望图像顺时针旋转270度,并且原点位于左上角。 我想知道为什么。 在Nexus 5X上,传感器方向为270度。 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL不是LEGACY,LIMITED和FULL中的任何一个。

尝试使用JPEG格式和ImageReader的YUV_420_888格式。

如果将作物区域设置为较小,则它将扩大较小区域。 activity.getWindowManager()。getDefaultDisplay()。getRotation()的值为0 F-05J上的传感器方向为90度。 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL为旧版

后来,我找到了CameraCharacteristics参数SCALER_CROPPING_TYPE。 如果设备为LEGACY,则不支持FREEFORM类型,它将在活动阵列的中心附近裁剪。

public boolean onTouch(View view, MotionEvent motionEvent) {
    if(view != mTextureView) return  false;
    try {
        Rect rect = mCameraCaracteristics.get(
           CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        if (rect == null) return false;
        float currentFingerSpacing;
        if (motionEvent.getPointerCount() == 2) { //Multi touch.
            currentFingerSpacing = getFingerSpacing(motionEvent);
            float delta = 0.05f;
            if (fingerSpacing != 0) {
                if (currentFingerSpacing > fingerSpacing) { //zoom-in
                    if ((maximumZoomLevel - zoomLevel) <= delta) {
                        delta = maximumZoomLevel - zoomLevel;
                    }
                    zoomLevel = zoomLevel + delta;
                } else if (currentFingerSpacing < fingerSpacing){
                    if ((zoomLevel - delta) < 1f) {
                        delta = zoomLevel - 1f;
                    }
                    zoomLevel = zoomLevel - delta;
                }
                Rect zoom = new Rect();
                //for example, want to zoom in on the right top
                int centerx = 3500; int centery = 500;
                int width = 600;
                int height = 800;
                //adjust the corner points
                zoom.left=(int)centerx-width/2;
                if(zoom.left<0) zoom.left=0;
                zoom.top=(int)centery-height/2; 
                if(zoom.top < 0) zoom.top=0;
                zoom.right=(int)centerx+width/2; 
                zoom.bottom=(int)centery+height/2;
                if(zoom.right>rect.width()) zoom.right=rect.width();
                if(zoom.bottom>rect.height()) zoom.bottom=rect.height();
                mPreviewRequestBuilder.set(
                       CaptureRequest.SCALER_CROP_REGION, zoom);
             }
             fingerSpacing = currentFingerSpacing;
          } else { //Single touch point
             return true;
          }

          mCaptureSession.setRepeatingRequest(
               mPreviewRequestBuilder.build(),mCaptureCallback, null);
            return true;
       } catch(Exception e)
       {
           e.printStackTrace();
           return true;
       }

我希望特定点附近的作物区域能够正常工作。

0 个答案:

没有答案