首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用camera2时获取当前缩放值

,可以通过CameraCharacteristics类和CameraCaptureSession类来实现。

首先,需要获取相机的特性信息,可以使用CameraManager类来获取相机的相关信息。通过CameraManager的getCameraCharacteristics()方法获取相机的特性对象CameraCharacteristics。然后,通过CameraCharacteristics的get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM)方法获取相机的最大数字缩放值。

接下来,创建CameraCaptureSession对象,并在其回调方法中获取当前的缩放值。首先,需要创建一个CameraCaptureSession.StateCallback对象,并实现其onConfigured()方法。在onConfigured()方法中,可以获取到CameraCaptureSession对象。然后,通过CameraCaptureSession的getParameters()方法获取当前的相机参数对象,并通过参数对象的getZoom()方法获取当前的缩放值。

以下是一个示例代码:

代码语言:txt
复制
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.MeteringRectangle;
import android.os.Bundle;
import android.util.Log;
import android.util.Range;
import android.util.Size;
import android.view.Surface;
import android.view.TextureView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Camera2ZoomExample";

    private CameraManager cameraManager;
    private String cameraId;
    private CameraCharacteristics cameraCharacteristics;
    private CameraCaptureSession cameraCaptureSession;

    private TextureView textureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textureView = findViewById(R.id.textureView);

        cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);

        try {
            cameraId = cameraManager.getCameraIdList()[0];
            cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
            @Override
            public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
                openCamera();
            }

            @Override
            public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {

            }

            @Override
            public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
                return false;
            }

            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

            }
        });
    }

    private void openCamera() {
        try {
            cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
                @Override
                public void onOpened(@NonNull CameraDevice cameraDevice) {
                    createCaptureSession(cameraDevice);
                }

                @Override
                public void onDisconnected(@NonNull CameraDevice cameraDevice) {
                    cameraDevice.close();
                }

                @Override
                public void onError(@NonNull CameraDevice cameraDevice, int error) {
                    cameraDevice.close();
                }
            }, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    private void createCaptureSession(CameraDevice cameraDevice) {
        List<Surface> surfaces = new ArrayList<>();
        SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(textureView.getWidth(), textureView.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);
        surfaces.add(previewSurface);

        try {
            cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(@NonNull CameraCaptureSession session) {
                    cameraCaptureSession = session;
                    try {
                        CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                        captureRequestBuilder.addTarget(previewSurface);

                        // 设置缩放值
                        float zoomValue = getZoomValue();
                        captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, getZoomRect(zoomValue));

                        CaptureRequest captureRequest = captureRequestBuilder.build();
                        cameraCaptureSession.setRepeatingRequest(captureRequest, null, null);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                    Log.e(TAG, "Failed to configure camera capture session");
                }
            }, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    private float getZoomValue() {
        float maxZoom = cameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
        float currentZoom = 1.0f; // 默认缩放值为1.0

        // 获取当前缩放值的逻辑

        return currentZoom;
    }

    private MeteringRectangle getZoomRect(float zoomValue) {
        Rect sensorRect = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        Rect cropRect = cameraCharacteristics.get(CameraCharacteristics.SCALER_CROP_REGION);

        int centerX = sensorRect.width() / 2;
        int centerY = sensorRect.height() / 2;

        int deltaX = (int) (0.5f * sensorRect.width() / zoomValue);
        int deltaY = (int) (0.5f * sensorRect.height() / zoomValue);

        Rect zoomRect = new Rect(centerX - deltaX, centerY - deltaY, centerX + deltaX, centerY + deltaY);
        zoomRect.intersect(cropRect);

        return new MeteringRectangle(zoomRect, MeteringRectangle.METERING_WEIGHT_MAX);
    }
}

在上述示例代码中,首先通过CameraCharacteristics的get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM)方法获取相机的最大数字缩放值。然后,在CameraCaptureSession的回调方法onConfigured()中,通过CameraCaptureSession的getParameters()方法获取当前的相机参数对象,并通过参数对象的getZoom()方法获取当前的缩放值。

请注意,示例代码中的获取当前缩放值的逻辑需要根据具体的需求进行实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券