web-dev-qa-db-ja.com

CameraXがAndroid Studioで必要なだけの写真を拡大できないのはなぜですか?

CameraXを学習しています。 CameraXBasic はサンプルコードです。

CameraFragment.kt に基づいて、zoomX関数を記述します。コードAを見ることができます。関数はいつでも画像を拡大できます。

zoomX(2f)zoomX(3f)などの小さい値で呼び出すと、画像を拡大できることがわかりましたが、大きな値を使用すると、画像が再び拡大されません。 zoomX(6.0f)zoomX(7.0f)などの値...なぜですか?

コードA

   private lateinit var viewFinder: TextureView 
    private var preview: Preview? = null

    fun zoomX(orign: Float ){       
        val x=orign+1

        val singleWidth=viewFinder.width/x
        val singleHeight=viewFinder.height/x

        val left=viewFinder.width/2f-singleWidth/2f
        val right=left+singleWidth
        val top=viewFinder.height/2f-singleHeight/2f
        val bottom=top+singleHeight

        val my= Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
        preview?.zoom(my)      
    }
8
HelloCW

これは伝統の問題ではなく、Futuresの問題です。 CameraXBasic の例を_1.0.0-alpha06_から_1.0.0-alpha08_に更新すると多くの問題が発生しますが、CameraX CameraControl には次の2つのメソッドがあります。

_0f_から_1.0f_までの線形ズーム値によって現在のズームを設定します。

_linearZoom 0f_は最小ズームを表し、_linearZoom 1.0f_は最大ズームを表します。 linearZoomの利点は、スライダーUI要素で使用するために、視野(FOV)がlinearZoomの値とともに直線的に変化することを保証することです(一方、setZoomRatio(float)はピンチズームジェスチャー)。

現在のズームを比率で設定します。

現在のzoomRatiolinearZoomの両方を変更するため、アプリがzoomRatioまたはlinearZoomを監視している場合は、更新も取得されます。比率がCameraInfo.getMinZoomRatio()より小さいか、CameraInfo.getMaxZoomRatio()より大きい場合、返されたListenableFutureIllegalArgumentExceptionで失敗し、現在のズーム率は変更されません。比率をクランプするのはアプリケーションの義務です。

Executor も参照してください CameraXExecutors もあります。


CameraXBasicの例を壊すすべてのAPIの変更については、 リリースノート または commits ...も参照してください。これらのAPIの違いについてはこれ以上説明しません(これは問題ではなかったためです)が、 fork forked it; issues#131 を参照してください(これまでのところ、少なくともプレビューはそこで機能します)。


これが実際に機能する方法です。

_val camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
val control: CameraControl = camera.cameraControl
control.setZoomRatio(5.0f)
_

_1.0f_から_8.0f_までのズーム比は、Motorola XT1900で機能します。

_val info: CameraInfo = camera.cameraInfo
val cameraId = (info as Camera2CameraInfoImpl).cameraId
val zoomRatio = info.getZoomRatio().value
val maxZoomRatio = info.getMaxZoomRatio().value
val minZoomRatio = info.getMinZoomRatio().value
val linearZoom = info.getLinearZoom().value
_
3
Martin Zeitler

Android伝統、ズームレベルは01の間にあり、他の多くの値と同じです。

0は、最低のズームレベルを意味します。

1は最大ズームレベルを意味します。

これは浮動小数点値なので、0.10.20.9などのように増やします。

0
Ibrahim Ali

まず最初に、getMaxZoom()メソッドを使用して、カメラの最大ズーム値を見つけます。

https://developer.Android.com/reference/Android/hardware/Camera.Parameters.html#getMaxZoom()

カメラプレビューを使用している場合は、Rectを使用してカメラプレビューのズームインを設定できます。以下のように-

PreviewConfig config = new PreviewConfig.Builder().build();
    Preview preview = new Preview(config);

    Rect rect = Rect(left, top, right, bottom);
    preview.zoom(rect)

    preview.setOnPreviewOutputUpdateListener(
        new Preview.OnPreviewOutputUpdateListener() {
            @Override
            public void onUpdated(Preview.PreviewOutput previewOutput) {
                // Your code here. For example, use previewOutput.getSurfaceTexture()
                // and post to a GL renderer.
            };
    });

    CameraX.bindToLifecycle((LifecycleOwner) this, preview);

詳細はこちらからご覧いただけます- Androidカメラプレビューズーム、ダブルフィンガータッチを使用

0
Al-Amin