首页
学习
活动
专区
工具
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()方法获取当前的缩放值。

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

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

相关·内容

使用Camera2获取depth图像

有不同的方法来计算经过的时间(S10 5G使用红外载波相移检测,940nm iirc),但基本理论是保持不变的。...它的视场为75°,大致与S10 5G前置摄像头的80°视场相匹配 Note: S10 5G(以及Note10+5G)通过Camera2 API返回两个摄像头。...depthRange : 0; } 可以尝试过滤掉更高的置信度,但对于隐私模糊功能,我发现最好让所有的置信度都通过(0除外),然后再进行一些信号处理。...将置信度最小设置得更高会在一定程度上减少总体噪声,但这样会删除太多有用的信息 可视化深度信息 这里的方法是简单的将深度信息归一化到[0, 255] private int normalizeRange...YUV/RGB格式 协调多个摄像头的启动/关闭,以及在切换到和退出隐私模式管理变换(通过drawBitmap进行渲染代价非常大,非必要不使用) 最后贴一个演示效果 作者: plluke Working

1.1K20

java获取当前系统时间毫秒_java 当前日期

获取当前时间的方法 //第一种方法 long totalMilliSeconds = System.currentTimeMillis(); //第二种方法 (常用) Date date...= new Date(); date.getTime(); 获取时间的毫秒 //第一种方法 //获取00:00:00的毫秒数 String s= DateFormatUtils.format...date的 //第二种方法 long totalMilliSeconds = System.currentTimeMillis(); 通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便...,同时还可以获取当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的。...为了获取这个时间戳,很多人也喜欢使用new Date().getTime()去获取,咋一看没什么问题,但其实没这个必要。

4.4K10

【MATLAB】基本绘图 ( 句柄 | 对象句柄获取 | 创建对象获取句柄 | 函数获取句柄 | 获取 设置 对象属性 | 获取对象属性 )

文章目录 一、对象句柄获取 1、句柄 2、创建对象获取句柄 3、函数获取句柄 4、获取 / 设置 对象属性 二、获取对象属性 1、获取 线 对象属性 2、获取 坐标轴 对象属性 一、对象句柄获取...---- 1、句柄 对象的句柄 , 类似于编程的引用 , 将对象的句柄赋值给变量后 , 该变量就可以代表指定的绘图对象 ; 对象的 Handle 标识 ; 2、创建对象获取句柄 创建对象获取图形对象句柄...: 创建对象 , 使用变量接收该对象 , 下面的代码就是使用 line_sin 变量获取 线 对象的句柄 ; line_sin = plot(x, y) 3、函数获取句柄 使用函数获取对象句柄...: 下面的函数是获取相关对象句柄的函数 ; gca : 获取当前坐标轴的句柄 ; gcf : 获取当前图形的句柄 ; allchild : 查找特定对象的所有子对象的句柄 ; ancestor...坐标轴 对象属性 使用 get(gca) 可以获取当前坐标轴对象的属性 ; 代码示例 : % x 轴变量 % 在 0 ~ 2pi 之间产生 1000 个数值 x = linspace(0, 2 * pi

6.4K30

JS实现动态获取当前点击事件的id属性

整个页面是通过ajax请求最新的4部视频进行填充完成,视频列表又是通过template-web.js插件补上去的,所以导致所有ID都是一样的,一开始给按钮添加一个事件,结果是所有播放按钮都是播放第一个视频...于是,想了好多办法,又把ID属性给弄成动态的ajax请求的属性,实现了每个id不一样,接下来,因为点击播放要调用一个方法,进行解析视频播放,拼接成API+视频链接的格式在新打开的弹窗进行展示。...具体可以看下图: 要实现点击不同按钮,并且按钮ID是动态从ajax请求获取的,还要添加点击视频拼接视频链接,参考了文章,可以获取点击按钮的id,然后使用button,将链接放在value中 Dom...对象的id属性可以获取元素的id。...-- HTML结构 --> 播放 // javascript

25.7K20

CameraX 1.1 有哪些新的特性发布?

何时使用 CameraX 或 Camera2,这取决于您期望更快的开发速度或是想要更高的自定义程度。...我们来看一个例子: // 创建变量来跟踪 exposureIndex var exposureIndex = 0 // 使用 cameraSelector 将 imageCapture 和 preview...如果您想向用户展示 EV ,可以获取 exposureCompensationStep 来实现转换。...有一些设备有包括广角和长焦在内的多个镜头,CameraX 可以检测这些设备是否支持 SMOOTH_ZOOM 框架,在受支持的设备上使用 CameraX 的缩放控件,会自动使用所有的相机来实现更大的缩放范围...如果您已经在使用这个缩放控件,那当您使用 1.1 版本进行编译,您的应用应该就可以访问这些设备上的所有相机。 CameraX 1.1 的更多功能 接下来介绍我们在 1.1 中添加的更多功能。

1.7K20

使用 Metasploit 获取哈希或域内哈希

设置完后然后执行 exploit 运行(要运行两次,该脚本使用卷影拷贝服务): ?...这些文件可以与impacket等其他工具一起使用,这些工具可用于执行活动目录密码哈希的提取。ntds.dit 和 SYSTEM会放在 /root/.msf4/loot/ 文件夹下: ?...之后就可以使用 impacket 工具包等解析 ntds.dit文件,导出域账号和域散列值了。 Metasploit 会话获取域账号和哈希 首先是使用 msf 反弹了一个域控的 shell: ?...然后使用 MSF 的后渗透模块: use post/windows/gather/credentials/domain_hashdump set session 2 ?...还可以使用 hashdump 来导出用户 hash: ? 还可以通过 MSF 加载 mimikatz 来读取密码: # 加载mimikaz load mimikatz ?

1.7K30
领券