Swift-技巧(四)設置照片尺寸和格式
摘要
平時實現拍照功能時,都是網上一通搜索,整體複製粘貼,自稱無腦實現。但是當要求照片是不同的尺寸和格式( 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
}
題外話
時間倉促,說的東西可能不全面,在你實現過程中遇到什麼問題,評論區給我留言,我會儘快回復