Tại sao CameraX không thể phóng to ảnh lớn hơn tôi cần trong Android Studio?


8

Tôi đang học CameraX và CameraXBasic là một mã mẫu.

Tôi viết một hàm zoomX dựa trên CameraFragment.kt . bạn có thể thấy Mã A. Tôi nghĩ rằng chức năng có thể phóng to hình ảnh bất cứ lúc nào.

Tôi thấy rằng một bức tranh có thể zoom trong khi tôi gọi nó với sa giá trị nhỏ, chẳng hạn như zoomX(2f), zoomX(3f)nhưng hình ảnh sẽ không được phóng to thu nhỏ một lần nữa khi tôi sử dụng một giá trị lớn như zoomX(6.0f), zoomX(7.0f)... tại sao?

Mã 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)      
    }

Bạn có thể sử dụng CameraControl.setZoomPercentage()từandroidx.camera.camera-core:1.0.0-alpha01
sonnet

Cảm ơn! bạn vui lòng chỉ cho tôi biết thêm chi tiết về CameraControl.setZoomPercentage()? Tôi không thể tìm thấy nhiều tài liệu và mã mẫu.
HelloCW

Tôi đã sai. Nó alpha07chưa được phát hành. android.googlesource.com/pl platform / frameworks / support / + / Phiên bản mới nhất làalpha06
sonnet

Câu trả lời:


3

Đây không phải là một vấn đề của truyền thống, nhưng của Futures. Cập nhật ví dụ CameraXBasic từ 1.0.0-alpha06để 1.0.0-alpha08phá vỡ rất nhiều, nhưng CameraX CameraControl có hai phương pháp sau:

Đặt thu phóng hiện tại theo giá trị thu phóng tuyến tính từ 0fđến 1.0f.

linearZoom 0fđại diện cho thu phóng tối thiểu trong khi linearZoom 1.0fđại diện cho thu phóng tối đa. Ưu điểm của linearZoomnó là nó đảm bảo trường nhìn (FOV) thay đổi tuyến tính với linearZoomgiá trị, để sử dụng với các thành phần UI trượt (trong khi setZoomRatio(float)hoạt động tốt cho các cử chỉ pinch-zoom).

Đặt tỷ lệ thu phóng hiện tại theo tỷ lệ.

Nó sửa đổi cả hiện tại zoomRatiolinearZoomvì vậy nếu các ứng dụng đang quan sát zoomRatiohoặc linearZoom, chúng cũng sẽ nhận được bản cập nhật. Nếu tỷ lệ nhỏ hơn CameraInfo.getMinZoomRatio()hoặc lớn hơn CameraInfo.getMaxZoomRatio(), tỷ lệ được trả về ListenableFuturesẽ không thành công IllegalArgumentExceptionvà nó sẽ không sửa đổi tỷ lệ thu phóng hiện tại. Nhiệm vụ của ứng dụng là kẹp tỷ lệ.

Cũng xem Executor và cũng có CameraXExecutors.


Đồng thời xem ghi chú phát hành hoặc các cam kết ... cho tất cả các thay đổi API, phá vỡ ví dụ CameraXBasic. Tôi sẽ không giải thích thêm về những khác biệt API này (vì đây không phải là câu hỏi), nhưng đã bỏ qua nó; xem các vấn đề # 131 (cho đến nay, ít nhất là bản xem trước hoạt động ở đó).


Đây là cách nó thực sự hoạt động:

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

Tỷ lệ thu phóng từ 1.0fcho đến khi 8.0fhoạt động trên Motorola XT1900 của tôi:

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

Cảm ơn rât nhiều! Bạn có thể hiển thị một mã mẫu đầy đủ? để tôi có thể chạy và kiểm tra nó
HelloCW

BTW, dự án CameraXBasic không thể chạy sau khi tôi cập nhật nó từ 1.0.0-alpha06 thành 1.0.0-alpha08.
HelloCW

Cảm ơn! Có vẻ như việc hợp nhất chưa được thực hiện, vì vậy tôi không thể kéo nó vào PC để kiểm tra. Bạn có thể cho tôi một ngã ba tạm thời để kéo mã và kiểm tra?
HelloCW

BTW, tôi là người mới bắt đầu sử dụng GitHub, tôi không biết cách lấy từ github.com/android/camera-samples/compare/
Kẻ

Hiện tại, tôi chỉ kéo ngã ba caren / tap_to_f Focus, nhưng nó dựa trên "1.0.0-alpha05"
HelloCW

0

Đó là truyền thống của Android, mức thu phóng tồn tại giữa 01giống như nhiều giá trị khác ..

0 có nghĩa là mức thu phóng thấp nhất.

1 có nghĩa là mức thu phóng tối đa.

Đó là một giá trị float, do đó bạn tăng nó như 0.1, 0.2, 0.9và vân vân.


0

Trước hết, tìm ra giá trị thu phóng tối đa của máy ảnh - sử dụng getMaxZoom()phương pháp.

https://developer.android.com/reference/android/hardware/Camera.Parameter.html#getMaxZoom ()

Nếu bạn đã sử dụng Xem trước máy ảnh thì bạn có thể đặt thu phóng trong Xem trước máy ảnh bằng cách sử dụng Rect. Giống như bên dưới -

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);

Bạn có thể biết thêm chi tiết từ đây - Thu phóng bản xem trước của Máy ảnh Android bằng cách chạm hai ngón tay


Cảm ơn! nhưng CameraX không hỗ trợ getMaxZoom ().
HelloCW
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.