چیزهای جدید در CameraX 1.4.0 و نگاهی گذرا به پشتیبانی از Jetpack Compose
انتشار: آذر 27، 1403
بروزرسانی: 05 اردیبهشت 1404

چیزهای جدید در CameraX 1.4.0 و نگاهی گذرا به پشتیبانی از Jetpack Compose


ارسال شده توسط اسکات نین – مهندس نرم افزار (scottnien@)

برای ارتقا سطح برنامه های دوربین اندروید خود آماده شوید! CameraX 1.4.0 با انبوهی از ویژگی ها و پیشرفت های شگفت انگیز جدید به تازگی سقوط کرد. ما در مورد قابلیت های HDR گسترده، تثبیت کننده پیش نمایش و چارچوب افکت همه کاره، و کلی چیزهای جالب برای کشف صحبت می کنیم. همچنین نحوه ادغام یکپارچه CameraX با Jetpack Compose را بررسی خواهیم کرد! بیایید وارد آن شویم و ببینیم این پیشرفت ها چگونه می توانند برنامه دوربین شما را به سطح بالاتری ببرند.

پیش نمایش HDR و Ultra HDR

یک تصویر ت،یم بندی شده، کیفیت تصویر محدوده دینامیکی استاندارد (SDR) و محدوده دینامیکی بالا (HDR) را با استفاده از یک تصویر منفرد از یک منظره دقیق مقایسه می کند. سمت HDR زنده تر و پر جنب و جوش تر است.

محدوده دینامیکی بالا (HDR) یک تغییر دهنده بازی برای عکاسی است که طیف وسیع تری از نور و جزئیات را برای ایجاد تصاویر واقعی خیره کننده ثبت می کند. با CameraX 1.3.0، ما قابلیت های ضبط ویدیوی HDR را برای شما به ارمغان آوردیم، و اکنون در نسخه 1.4.0، آن را حتی فراتر می گذاریم! آماده شوید برای پیش نمایش HDR و Ultra HDR. این افزودنی های هیجان انگیز به شما این امکان را می دهد که تجربه بصری غنی تری را به کاربران خود ارائه دهید.

پیش نمایش HDR

این ویژگی جدید به شما این امکان را می دهد که HDR را در پیش نمایش بدون نیاز به اتصال یک مورد استفاده از VideoCapture فعال کنید. این به ویژه برای برنامه هایی مفید است که از یک جریان پیش نمایش واحد برای نمایش پیش نمایش در صفحه نمایش و ضبط ویدیو با خط لوله OpenGL استفاده می کنند.

برای فعال ، کامل HDR، باید مطمئن شوید که خط لوله OpenGL شما قادر به پردازش فرمت محدوده دینامیکی خاص است و سپس قابلیت دوربین را بررسی کنید.

قطعه کد زیر را به ،وان مثال برای فعال ، HLG10 که استاندارد پایه HDR است که سازندگان دستگاه باید در دوربین هایی با ،وجی 10 بیت پشتیب، کنند، ببینید.

// Declare your OpenGL pipeline supported dynamic range format. val openGLPipelineSupportedDynamicRange = setOf(     DynamicRange.SDR,      DynamicRange.HLG_10_BIT)// Check camera dynamic range capabilities. val isHlg10Supported =       cameraProvider.getCameraInfo(cameraSelector) .querySupportedDynamicRanges(openGLPipelineSupportedDynamicRange) .contains(DynamicRange.HLG_10_BIT)val preview = Preview.Builder().apply {     if (isHlg10Supported) {        setDynamicRange(DynamicRange.HLG_10_BIT)     }}

Ultra HDR

معرفی Ultra HDR، یک فرمت جدید در اندروید 14 که به کاربران امکان می دهد ع، های واقعی و خیره کننده با محدوده دینامیکی باورن،ی ثبت کنند. و بهترین بخش؟ CameraX 1.4.0 افزودن فیلمبرداری Ultra HDR به برنامه خود را تنها با چند خط کد بسیار آسان می کند:

val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERAval cameraInfo = cameraProvider.getCameraInfo(cameraSelector)val isUltraHdrSupported =       ImageCapture.getImageCaptureCapabilities(cameraInfo)        .supportedOutputFormats        .contains(ImageCapture.OUTPUT_FORMAT_JPEG_ULTRA_HDR)val imageCapture = ImageCapture.Builder().apply {    if (isUltraHdrSupported) {        setOutputFormat(ImageCapture.OUTPUT_FORMAT_JPEG_ULTRA_HDR)    }}.build()

پشتیب، از Jetpack Compose

در حالی که این پست بر روی 1.4.0 تمرکز دارد، ما هیجان زده هستیم که پشتیب، Jetpack Compose را در CameraX 1.5.0 alpha اعلام کنیم. ما در حال اضافه ، پشتیب، برای یک نمایاب Composable ساخته شده در بالای آن هستیم AndroidExternalSurface و AndroidEmbeddedExternalSurface. این CameraXViewfinder Composable یک سطح نمایشگر را به یک جعبه استفاده CameraX Preview متصل می کند و پیچیدگی های چرخش، مقیاس بندی و چرخه عمر سطح را کنترل می کند، بنابراین نیازی به این کار ندارید.

// in build.gradle implementation ("androidx.camera:camera-compose:1.5.0-alpha03")cl، PreviewViewModel : ViewModel() {    private val _surfaceRequests = MutableStateFlow(null)    val surfaceRequests: StateFlow        get() = _surfaceRequests.asStateFlow()    private fun ،uceSurfaceRequests(previewUseCase: Preview) {        // Always publish new SurfaceRequests from Preview        previewUseCase.setSurfaceProvider { newSurfaceRequest ->  _surfaceRequests.value = newSurfaceRequest        }    }    // ...}@Composablefun MyCameraViewfinder(    viewModel: PreviewViewModel,    modifier: Modifier = Modifier) {    val currentSurfaceRequest: SurfaceRequest? by        viewModel.surfaceRequests.collectAsState()    currentSurfaceRequest?.let { surfaceRequest ->        CameraXViewfinder(  surfaceRequest = surfaceRequest,  implementationMode = ImplementationMode.EXTERNAL, // Or EMBEDDED  modifier = modifier                )    }}

API های دوستدار Kotlin

CameraX حتی کاتلین پسندتر می شود! در نسخه 1.4.0، دو عملکرد تعلیق جدید را برای ساده سازی مقداردهی اولیه دوربین و ضبط تصویر معرفی کرده ایم.

// CameraX initialization val cameraProvider = ProcessCameraProvider.awaitInstance()val imageProxy = imageCapture.takePicture() // Processing imageProxyimageProxy.close()

پیش نمایش حالت تثبیت و آینه

پیش نمایش تثبیت

حالت تثبیت پیش نمایش در Android 13 اضافه شد تا تثبیت را در تمام جریان های غیر RAW، از جمله پیش نمایش ها و سطوح ورودی MediaCodec فعال کند. در مقایسه با قبلی حالت تثبیت ویدیو، که ممکن است FoV (فیلد دید) متناقض بین پیش نمایش و ویدیوی ضبط شده داشته باشد، این حالت تثبیت کننده پیش نمایش جدید ثبات را تضمین می کند و بنابراین تجربه کاربری بهتری را ارائه می دهد. برای برنامه هایی که پیش نمایش را مستقیماً برای ضبط ویدیو ضبط می کنند، این حالت تنها راه فعال ، تثبیت سازی است.

برای فعال ، تثبیت پیش نمایش کد زیر را دنبال کنید. لطفاً توجه داشته باشید که هنگامی که تثبیت کننده پیش نمایش روشن می شود، نه تنها بر روی Preview اعمال می شود، بلکه در صورت محدود بودن، روی VideoCapture نیز اعمال می شود.

val isPreviewStabilizationSupported =      Preview.getPreviewCapabilities(cameraProvider.getCameraInfo(cameraSelector))        .isStabilizationSupportedval preview = Preview.Builder().apply {    if (isPreviewStabilizationSupported) {      setPreviewStabilizationEnabled(true)    }}.build()

MirrorMode

در حالی که CameraX 1.3.0 حالت آینه ای را برای VideoCapture معرفی کرد، اکنون این ویژگی مفید را به Preview در نسخه 1.4.0 آورده ایم. این مخصوصاً برای دستگاه هایی با نمایشگر بیرونی مفید است و به شما امکان می دهد هنگام استفاده از دوربین عقب، تجربه سلفی طبیعی تری ایجاد کنید.

برای فعال ، حالت آینه، به سادگی تماس بگیرید Preview.Builder.setMirrorMode API ها این ویژگی برای اندروید 13 و بالاتر پشتیب، می شود.

اثر بلادرنگ

CameraX 1.3.0 چارچوب CameraEffect را معرفی کرد که به شما این قدرت را می دهد که ،وجی دوربین خود را با OpenGL شخصی سازی کنید. اکنون، در نسخه 1.4.0، ما آن را یک قدم جلوتر می بریم. علاوه بر اعمال افکت های سفارشی خود، اکنون می تو،د از مجموعه ای از جلوه های از پیش ساخته شده توسط CameraX و Media3 استفاده کنید و بهبود ویژگی های دوربین برنامه خود را آسان تر از همیشه کنید.

جلوه همپوش،

هدف جدید جلوه های دوربین، پیاده سازی افکت های آماده برای استفاده است که با OverlayEffect شروع می شود. این افکت به شما امکان می دهد با استفاده از موارد آشنا، روی فریم های دوربین را همپوش، بکشید Canvas API.

کد نمونه زیر نحوه شناسایی کد QR و ترسیم شکل کد QR را پس از شناسایی نشان می دهد.

به طور پیش فرض، ترسیم در مختصات قاب سطح انجام می شود. اما اگر نیاز به استفاده از مختصات سنسور دوربین داشته باشید، چه؟ مشکلی نیست! OverlayEffect را فراهم می کند Frame#getSensorToBufferTransform تابع، به شما این امکان را می دهد که ماتریس تبدیل لازم را در overlayCanvas خود اعمال کنید.

در این مثال، ما از API های MLKit Vision CameraX (MlKitAnalyzer) و مشخص کنید COORDINATE_SYSTEM_SENSOR برای به دست آوردن نقاط گوشه کد QR در مختصات سنسور. این کار بدون توجه به جهت دستگاه یا نسبت صفحه نمایش، قرار دادن پوشش دقیق را تضمین می کند.

// in build.gradle implementation ("androidx.camera:camera-effects:1.4.1}")      implementation ("androidx.camera:camera-mlkit-vision:1.4.1")var qrcodePoints: Array? = nullvar qrcodeTimestamp = 0Lval qrcodeBoxEffect     = OverlayEffect(        PREVIEW /* applied on the preview only */,        5, /* ،ld multiple frames in the queue so we can match ،ysis result     with preview frame */,         Handler(Looper.getMainLooper()), {}      )fun initCamera() {    qrcodeBoxEffect.setOnDrawListener { frame ->        if(frame.timestamp != qrcodeTimestamp) {  // Do not change the drawing if the frame doesn’t match the ،ysis   // result.  return@setOnDrawListener true        }        frame.overlayCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)        qrcodePoints?.let {  // Using sensor coordinates to draw.  frame.overlayCanvas.setMatrix(frame.sensorToBufferTransform)  val path = android.graphics.Path().apply {      it.forEachIndexed { index, point ->if (index == 0) {    moveTo(point.x.toFloat(), point.y.toFloat())} else {    lineTo(point.x.toFloat(), point.y.toFloat())}       }       lineTo(it[0].x.toFloat(), it[0].y.toFloat())  }  frame.overlayCanvas.drawPath(path, paint)        }        true    }    val imageAnalysis = ImageAnalysis.Builder()        .build()        .apply {  setAnalyzer(executor,      MlKitAnalyzer(listOf(barcodeScanner!!),COORDINATE_SYSTEM_SENSOR,executor      ) { result ->val barcodes = result.getValue(barcodeScanner!!)qrcodePoints =     barcodes?.takeIf { it.size > 0}?.get(0)?.cornerPoints// track the timestamp of the ،ysis result and release the // preview frame.qrcodeTimestamp = result.timestampqrcodeBoxEffect.drawFrameAsync(qrcodeTimestamp)      }  )        }    val useCaseGroup = UseCaseGroup.Builder().addUseCase(preview).addUseCase(imageAnalysis).addEffect(qrcodeBoxEffect).build()    cameraProvider.bindToLifecycle(        lifecycleOwner, cameraSelector, usecaseGroup)  }

در اینجا تأثیر به نظر می رسد:

نمایی سیاه و سفید از داخل یک کافی شاپ که به خیابان شهر می نگرد. در پایین ع،، لبه یک میز با یک لپ تاپ و دو دکمه با بر،ب

فلش صفحه نمایش

گرفتن سلفی در نور کم با CameraX 1.4.0 ساده تر شد! این نسخه یک ویژگی جدید قدرتمند را معرفی می کند: فلاش صفحه. به جای تکیه بر فلاش LED سنتی که ا،ر دوربین های سلفی از آن بی بهره اند، فلاش صفحه نمایش هوشمندانه از نمایشگر گوشی شما استفاده می کند. با چرخاندن لحظه ای صفحه نمایش به رنگ سفید روشن، انبوهی از نور را فراهم می کند که به گرفتن سلفی های واضح و پر جنب و جوش حتی در شرایط نوری چالش برانگیز کمک می کند.

ادغام فلاش صفحه در برنامه CameraX شما انعطاف پذیر و ساده است. شما دو گزینه اصلی دارید:

      1. اجرا کنید ScreenFlash رابط: این به شما کنترل کامل بر رفتار فلاش صفحه نمایش می دهد. می تو،د رنگ، شدت، مدت زمان و هر جنبه دیگری از فلاش را سفارشی کنید. این ایده آل است اگر به یک راه حل بسیار من، نیاز دارید.

      2. از پیاده سازی داخلی استفاده کنید: برای یک راه حل سریع و آسان، از عملکرد فلش صفحه نمایش از پیش ساخته شده در ScreenFlashView یا پیش نمایش. این پیاده سازی تمام کارهای سنگین را برای شما انجام می دهد.

اگر قبلاً استفاده می کنید پیش نمایش در برنامه شما، فعال ، فلاش صفحه بسیار ساده است. فقط آن را مستقیماً روی آن فعال کنید پیش نمایش نمونه اگر به کنترل بیشتری نیاز دارید یا از آن استفاده نمی کنید پیش نمایش، می تو،د استفاده کنید ScreenFlashView مستقیما

در اینجا یک مثال کد وجود دارد که نحوه فعال ، فلاش صفحه را نشان می دهد:

// case 1: PreviewView + CameraX core API.previewView.setScreenFlashWindow(activity.getWindow());imageCapture.screenFlash = previewView.screenFlashimageCapture.setFlashMode(ImageCapture.FLASH_MODE_SCREEN)// case 2: PreviewView + CameraControllerpreviewView.setScreenFlashWindow(activity.getWindow());cameraController.setImageCaptureFlashMode(ImageCapture.FLASH_MODE_SCREEN);// case 3 : use ScreenFlashView screenFlashView.setScreenFlashWindow(activity.getWindow());imageCapture.setScreenFlash(screenFlashView.getScreenFlash());imageCapture.setFlashMode(ImageCapture.FLASH_MODE_SCREEN);

ویژگی های جدید برنامه افزودنی دوربین

هدف APIهای برنامه افزودنی دوربین کمک به برنامه ها برای دسترسی به قابلیت های پیشرفته ای است که قبلاً فقط در برنامه های داخلی دوربین موجود بود. و ا،یستم به سرعت در حال رشد است! در سال 2024، شاهد بودیم که بازیکنان بزرگی مانند پی،ل، سامسونگ، شیائومی، اوپو، وان پ،، ویوو و آنر همگی از افزونه های دوربین، به ویژه برای حالت شب و حالت بوکه استقبال می کنند. CameraX 1.4.0 با افزودن پشتیب، از ویژگی های جدید دوربین Android 15 Extensions، از جمله:

    • نمایش پست: پیش نمایشی از تصویر گرفته شده را تقریباً بلافاصله قبل از تکمیل ع، های با نوردهی طول، ارائه می دهد.
    • پیشرفت فرآیند ضبط: نشانگر پیشرفت را نمایش می دهد تا کاربران بدانند ضبط و پردازش چقدر طول می کشد و تجربه را برای ویژگی هایی مانند حالت شب بهبود می بخشد.
    • قدرت ،دها: به کاربران اجازه می دهد تا شدت اثر اعمال شده را به دقت تنظیم کنند

در زیر نمونه ای از UX بهبودیافته است که از ویژگی های پیشرفت فرآیند پس نما و ضبط در Samsung S24 Ultra استفاده می کند.

ویژگی های پیشرفت فرآیند ثبت تصویر متحرک در Samsung S24 Ultra

علاقه مندید بد،د چگونه می توان این را پیاده سازی کرد؟ نمونه کد زیر را ببینید:

val extensionsCameraSelector =      extensionsManager        .getExtensionEnabledCameraSelector(DEFAULT_BACK_CAMERA, extensionMode)val isPostviewSupported = ImageCapture.getImageCaptureCapabilities(         \xa0\xa0 \xa0cameraProvider.getCameraInfo(extensionsCameraSelector)).isPostviewSupportedval imageCapture = ImageCapture.Builder().apply {    setPostviewEnabled(isPostviewSupported)}.build()imageCapture.takePicture(outputfileOptions, executor,      object : OnImageSavedCallback {        override fun onImageSaved(outputFileResults: OutputFileResults) {  // final image saved.         }        override fun onPostviewBitmapAvailable(bitmap: Bitmap) {  // Postview bitmap is available.        }        override fun onCaptureProcessProgressed(progress: Int) {  // capture process progress update         }}
مهم: اگر برنامه شما در دستگاه های سری Pixel 9 با مشکل برنامه افزودنی CameraX مواجه شد، لطفاً به جای آن از CameraX 1.4.1 استفاده کنید. این نسخه یک مشکل حیاتی را برطرف می کند که مانع از عملکرد صحیح حالت شبانه می شد ع، بگیرید.

چه خبر بعدی

امیدواریم از این نسخه جدید لذت ببرید. ماموریت ما این است که توسعه دوربین را به یک لذت تبدیل کنیم، نقاط اصطکاک و درد را از بین ببریم تا بتو،د روی نوآوری تمرکز کنید. با CameraX، می تو،د به راحتی از قدرت قابلیت های دوربین اندروید استفاده کنید و تجربه های واقعا شگفت انگیزی از برنامه ایجاد کنید.

سوالی دارید یا می خواهید با تیم CameraX ارتباط برقرار کنید؟ به گروه بحث برنامه نویس CameraX بپیوندید یا یک گزارش اشکال ارسال کنید:

ما نمی تو،م صبر کنیم تا ببینیم چه چیزی ایجاد می کنید!



منبع: http://android-developers.googleblog.com/2024/12/whats-new-in-camerax-140-and-jetpack-compose-support.html