簡體   English   中英

android camera2手柄縮放

[英]android camera2 handle zoom

我是Android Camera2 API的新手。 我只是將我的所有項目移動到新的Camera2 API。 我使用Camera2Basic示例作為起點。

我現在通過添加以下內容來嘗試縮放:

public boolean onTouchEvent(MotionEvent event) {
    try {
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId);
        float maxZoom = (characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM))*10;

        Rect m = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        int action = event.getAction();
        float current_finger_spacing;

        if (event.getPointerCount() > 1) {
            // Multi touch logic
            current_finger_spacing = getFingerSpacing(event);

            if(finger_spacing != 0){
                if(current_finger_spacing > finger_spacing && maxZoom > zoom_level){
                    zoom_level++;

                }
                else if (current_finger_spacing < finger_spacing && zoom_level > 1){
                    zoom_level--;

                }
                int minW = (int) (m.width() / maxZoom);
                int minH = (int) (m.height() / maxZoom);
                int difW = m.width() - minW;
                int difH = m.height() - minH;
                int cropW = difW /100 *(int)zoom_level;
                int cropH = difH /100 *(int)zoom_level;
                cropW -= cropW & 3;
                cropH -= cropH & 3;
                Rect zoom = new Rect(cropW, cropH, m.width() - cropW, m.height() - cropH);
                mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom);
            }
            finger_spacing = current_finger_spacing;
        }
        else{
            if (action == MotionEvent.ACTION_UP) {
                //single touch logic
            }
        }

        try {
            mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback,
                    null);
        }
        catch (CameraAccessException e) {
            e.printStackTrace();
        }
        catch (NullPointerException ex)
        {
            ex.printStackTrace();
        }
    }
    catch (CameraAccessException e)
    {
        throw new RuntimeException("can not access camera.", e);
    }

    return true;
}

還有這個:

private float getFingerSpacing(MotionEvent event) {
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return FloatMath.sqrt(x * x + y * y);
}

但是在拍攝之后,圖片結果沒有變焦。 我怎樣才能實現呢? 謝謝大家。

更新需要添加captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); captureStillPicture()方法。

需要添加captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom); captureStillPicture()方法。

你只設置SCALER_CROP_REGIONCaptureRequestBuilder的重復預覽攝像機輸出。 你只需要同類作物的區域屬性添加到CaptureRequestBuilder使用該ImageSaver的JPEG Surface作為輸出,你應該准備就緒。

只需將SCALER.CROP.REGION設置為captureBuilder 你可以這樣做:

yourCapturebuilder.(CaptureRequest.SCALER_CROP_REGION, newZoom);

換句話說,如果您想保持Zoom的偏好。 我建議你做這樣的事情:將Rect作為字符串保存在首選項中,稍后恢復它以使用它,或者每次打開相機時調用它:

Preferences.edit().putString(CameraSettings.KEY_ZOOM,newZoom.toString());

稍后調用此方法動態設置縮放:

public boolean setZoomValue(CaptureRequest.Builder builder) {
        Log.i(TAG,"zoom preference value " + mPreferences.getString(CameraSettings.KEY_ZOOM,null));
        String rawZoomValue =  mPreferences.getString(CameraSettings.KEY_ZOOM, null);
        if (rawZoomValue == null)
            return false;
        rawZoomValue = rawZoomValue.replaceAll("[Rect() ]", "");
        String[] rectZoomList = rawZoomValue.split(",|\\-|\\)|\\(");
        Rect zoomValue = new Rect( Integer.parseInt(rectZoomList[0]), Integer.parseInt(rectZoomList[1]), Integer.parseInt(rectZoomList[2]),Integer.parseInt(rectZoomList[3]));
        builder.set(CaptureRequest.SCALER_CROP_REGION, zoomValue);
        Log.i(TAG, "Zoom applied: " + zoomValue);
        return true;

    }

全球:

companion object {
    private const val ZOOM_GESTURE_SENSITIVITY = .0005f
    private const val MAX_ZOOM_FACTOR = 3f
}

private var fingerDistance: Float? = null
private var zoom = 1f

監聽器:

textureView.setOnTouchListener({ _, event ->
    if (event.action != MotionEvent.ACTION_MOVE || event.pointerCount <= 1) {
        fingerDistance = null
        return@setOnTouchListener true
    }
    val newFingerDistance = with(event) {
        val x = getX(0) - getX(1)
        val y = getY(0) - getY(1)
        sqrt(x * x + y * y) * resources.displayMetrics.density
    }
    if (fingerDistance != null) {
        val manager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
        val characteristics = manager.getCameraCharacteristics(cameraId)
        val maxZoom = min(MAX_ZOOM_FACTOR, characteristics.get(
                CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM))
        val zoomChange = (newFingerDistance - fingerDistance!!) * ZOOM_GESTURE_SENSITIVITY
        zoom = min(maxZoom, max(1f, zoom + zoomChange))
        val sensorSize = characteristics.get(
                CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)!!
        val cropW = (sensorSize.width() * (1 - 1 / zoom) / 2).toInt()
        val cropH = (sensorSize.width() * (1 - 1 / zoom) / 2).toInt()
        val zoomRect = Rect(cropW, cropH,
                sensorSize.width() - cropW,
                sensorSize.height() - cropH)
        previewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomRect)
    }
    fingerDistance = newFingerDistance
    try {
        captureSession
                ?.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, null)
    } catch (e: Exception) {
        e.printStackTrace()
    }
    true
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM