Swift-技巧(四)設置照片尺寸和格式

摘要

平時實現拍照功能時,都是網上一通搜索,整體複製粘貼,自稱無腦實現。但是當要求照片是不同的尺寸和格式( JPEG)時,就費力搞照片。其實在設置拍照時,就可以直接設置照片的尺寸和格式,用直接的方法來滿足要求,豈不更好?

開始拍照前,需要創建 AVCaptureSession 會話對象,如果僅僅是拍照就需要再創建 AVCapturePhotoOutput 對象,預覽頁面在 AVCaptureVideoPreviewLayer 類的對象中呈現,捕捉照片時調用 AVCapturePhotoOutput 對象的 capturePhoto(with:, delegate:) 函數。如果對這個流程感興趣,給我留言,我會詳細的梳理這個流程,接下來進入本期的重點。

設置圖片的尺寸

設置圖片的尺寸要用到 sessionPreset 屬性,在設置 AVCaptureSession 會話配置時進行設置。

那麼 sessionPreset 是做什麼的?有這麼大的能量?

根據蘋果文檔的解釋來看,它是指示會話當前正在使用的的預設會話。這個設置會影響視頻流或者圖片的尺寸大小(這裏指的是像素,特別注意)。

可以設置的尺寸是和 AVCaptureSession.Preset 這個枚舉屬性是一一對應的,感興趣的可以在 Xcode 中追進去看一下,這裏簡單列出幾項:

Capture-preset

要特別注意兩點,這裏的是先 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
}

題外話

時間倉促,說的東西可能不全面,在你實現過程中遇到什麼問題,評論區給我留言,我會盡快回復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章