摘要
平時實現拍照功能時,都是網上一通搜索,整體復制粘貼,自稱無腦實現。但是當要求照片是不同的尺寸和格式( JPEG)時,就費力搞照片。其實在設置拍照時,就可以直接設置照片的尺寸和格式,用直接的方法來滿足要求,豈不更好?
開始拍照前,需要創建 AVCaptureSession
會話對象,如果僅僅是拍照就需要再創建 AVCapturePhotoOutput
對象,預覽頁面在 AVCaptureVideoPreviewLayer
類的對象中呈現,捕捉照片時調用 AVCapturePhotoOutput
對象的 capturePhoto(with:, delegate:)
函數。如果對這個流程感興趣,給我留言,我會詳細的梳理這個流程,接下來進入本期的重點。
設置圖片的尺寸
設置圖片的尺寸要用到 sessionPreset
屬性,在設置 AVCaptureSession
會話配置時進行設置。
那么 sessionPreset
是做什么的?有這么大的能量?
根據蘋果文檔的解釋來看,它是指示會話當前正在使用的的預設會話。這個設置會影響視頻流或者圖片的尺寸大小(這里指的是像素,特別注意)。
可以設置的尺寸是和 AVCaptureSession.Preset
這個枚舉屬性是一一對應的,感興趣的可以在 Xcode 中追進去看一下,這里簡單列出幾項:
要特別注意兩點,這里的是先 height 后 width,圖片已經紅色框出來了,這個尺寸是以像素為單位。
接下來就簡單了,根據需要照片的尺寸直接設置即可(默認是 .high
):
captureSession.sessionPreset = .high
設置圖片的格式
這里主要說明怎么將照片的格式設置為 JPEG。其實它還支持其他的格式,這里告訴方式,其他的格式直接追代碼就可以查看到。
如果稍有留意的看官,會發現捕捉照片的函數 capturePhoto(with settings: AVCapturePhotoSettings, delegate: AVCapturePhotoCaptureDelegate)
中要傳入 AVCapturePhotoSettings
類型的對象,那么就在這里面設置咱需要的照片格式:
// 驗證設備是否支持某一個格式
self.photoOutput.availablePhotoCodecTypes.contains(AVVideoCodecType(rawValue: AVVideoCodecJPEG)) {
// 設置圖片格式
photoSettings = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecJPEG])
}
然后將 photoSettings
對象傳入 capturePhoto
函數中,獲取的照片就是自己設置的格式了。這里面有很多其他的格式,詳細的可以追一下 AVVideoCodecType
類型看看。
鏡像是什么?
這里簡單提一下,如果項目中也使用到前置攝像頭來捕捉照片,會發現在同一個環境中,捕捉到的照片和后置攝像頭捕捉到的照片對比發現,竟然最有顛倒了。那么如何去在捕獲的時候就翻轉過來呢?
這里就需要在設置輸出對象的連接是設置 isVideoMirrored
,當設置為 true 時,就會將捕捉的照片鏡像翻轉。
// 輸出的連接對象
if let connection = self.photoOutput.connection(with: .video) {
// 設置是否鏡像,默認是 false
connection.isVideoMirrored = true
}
題外話
時間倉促,說的東西可能不全面,在你實現過程中遇到什么問題,評論區給我留言,我會盡快回復