亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

自帶root權(quán)限的框架 android網(wǎng)絡(luò)框架對(duì)比( 四 )


10) CaptureResult
CaptureResult 是每一次 Capture 操作的結(jié)果,里面包括了很多狀態(tài)信息,包括閃光燈狀態(tài)、對(duì)焦?fàn)顟B(tài)、時(shí)間戳等等 。
例如你可以在拍照完成的時(shí)候,通過(guò) CaptureResult 獲取本次拍照時(shí)的對(duì)焦?fàn)顟B(tài)和時(shí)間戳 。
需要注意的是,CaptureResult 并不包含任何圖像數(shù)據(jù),前面我們?cè)诮榻B Surface 的時(shí)候說(shuō)了,圖像數(shù)據(jù)都是從 Surface 獲取的 。
11) Request的整體處理流程
三、 代碼實(shí)戰(zhàn):如何拍攝單張照片
拍攝單張照片是最簡(jiǎn)單的拍照模式,它使用的就是 單次模式 的 Capture,我們會(huì)使用 ImageReader 創(chuàng)建一個(gè)接收照片的 Surface,并且把它添加到 CaptureRequest 里提交給相機(jī)進(jìn)行拍照,最后通過(guò) ImageReader 的回調(diào)獲取 Image 對(duì)象,進(jìn)而獲取 JPEG 圖像數(shù)據(jù)進(jìn)行保存 。
1) 定義回調(diào)接口
當(dāng)拍照完成的時(shí)候我們會(huì)得到兩個(gè)數(shù)據(jù)對(duì)象,一個(gè)是通過(guò) onImageAvailable() 回調(diào)給我們的存儲(chǔ)圖像數(shù)據(jù)的 Image,一個(gè)是通過(guò) onCaptureCompleted() 回調(diào)給我們的存儲(chǔ)拍照信息的 CaptureResult,它們是一一對(duì)應(yīng)的,所以我們定義了如下兩個(gè)回調(diào)接口:
private val captureResults: BlockingQueue<CaptureResult> = LinkedBlockingDeque()private inner class CaptureImageStateCallback : CameraCaptureSession.CaptureCallback() {@MainThreadoverride fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {super.onCaptureCompleted(session, request, result)captureResults.put(result)}}private inner class OnJpegImageAvailableListener : ImageReader.OnImageAvailableListener {@WorkerThreadoverride fun onImageAvailable(imageReader: ImageReader) {val image = imageReader.acquireNextImage()val captureResult = captureResults.take()if (image != null && captureResult != null) {// Save image into sdcard.}}}2) 創(chuàng)建 ImageReader
創(chuàng)建 ImageReader 需要我們指定照片的大小,所以首先我們要獲取支持的照片尺寸列表,并且從中篩選出合適的尺寸,假設(shè)我們要求照片的尺寸最大不能超過(guò) 4032×3024,并且比例必須是 4:3,所以會(huì)有如下篩選尺寸的代碼片段:
@WorkerThreadprivate fun getOptimalSize(cameraCharacteristics: CameraCharacteristics, clazz: Class<*>, maxWidth: Int, maxHeight: Int): Size? {val streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)val supportedSizes = streamConfigurationMap?.getOutputSizes(clazz)return getOptimalSize(supportedSizes, maxWidth, maxHeight)}@AnyThreadprivate fun getOptimalSize(supportedSizes: Array<Size>?, maxWidth: Int, maxHeight: Int): Size? {val aspectRatio = maxWidth.toFloat() / maxHeightif (supportedSizes != null) {for (size in supportedSizes) {if (size.width.toFloat() / size.height == aspectRatio && size.height <= maxHeight && size.width <= maxWidth) {return size}}}return null}接著我們就可以篩選出合適的尺寸,然后創(chuàng)建一個(gè)圖像格式是 JPEG 的 ImageReader 對(duì)象,并且獲取它的 Surface:
val imageSize = getOptimalSize(cameraCharacteristics, ImageReader::class.java, maxWidth, maxHeight)!!jpegImageReader = ImageReader.newInstance(imageSize.width, imageSize.height, ImageFormat.JPEG, 5)jpegImageReader?.setOnImageAvailableListener(OnJpegImageAvailableListener(), cameraHandler)jpegSurface = jpegImageReader?.surface3) 創(chuàng)建 CaptureRequest
接下來(lái)我們使用 TEMPLATE_STILL_CAPTURE 模板創(chuàng)建一個(gè)用于拍照的 CaptureRequest.Builder 對(duì)象,并且添加拍照的 Surface 和預(yù)覽的 Surface 到其中:
captureImageRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)captureImageRequestBuilder.addTarget(previewDataSurface)captureImageRequestBuilder.addTarget(jpegSurface)


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!

「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助: