首先需要實現UIImagePickerControllerDelegate 代理 實現其imagePickerController 方法 這里用於選擇圖片或的拍照回調
//調用相機拍照 或者 圖庫選擇 let picker = UIImagePickerController() picker.sourceType = .camera //圖庫 .photoLibrary picker.delegate = self picker.allowsEditing = true //開啟圖片編輯裁剪 會有正方形的選框顯示 UIApplication.shared.keyWindow?.rootViewController?.present(picker, animated: true, completion: nil) //圖片回調方法 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 獲取選擇的裁剪后的圖片 fixOrientation 處理旋轉不正常問題 並壓縮到300*300 let pickedImage = (info[UIImagePickerController.InfoKey.editedImage] as! UIImage).fixOrientation().scaleToSize(size: CGSize(width: 300, height: 300)) // 是否支持相冊 if UIImagePickerController.isValidImagePickerType(type: UIImagePickerType.UIImagePickerTypePhotoLibrary) { // 相冊 } else if (UIImagePickerController.isValidImagePickerType(type: UIImagePickerType.UIImagePickerTypeCamera)){ // 相機 // 圖片保存到相冊 UIImageWriteToSavedPhotosAlbum(pickedImage, self, Selector(("imageSave:error:contextInfo:")), nil) } //這里是個回調結構體 在使用的地方實現這個結構體即可獲取到處理好的圖片 if self.selectedImageBlock != nil { self.selectedImageBlock!(pickedImage) } picker.dismiss(animated: true) { } } //取消圖片選擇框 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) }
相關定義的方法
extension UIImage { /// 修復圖⽚旋轉 func fixOrientation() -> UIImage { if self.imageOrientation == .up { return self } var transform = CGAffineTransform.identity switch self.imageOrientation { case .down, .downMirrored: transform = transform.translatedBy(x: self.size.width, y: self.size.height) transform = transform.rotated(by: .pi) break case .left, .leftMirrored: transform = transform.translatedBy(x: self.size.width, y: 0) transform = transform.rotated(by: .pi / 2) break case .right, .rightMirrored: transform = transform.translatedBy(x: 0, y: self.size.height) transform = transform.rotated(by: -.pi / 2) break default: break } switch self.imageOrientation { case .upMirrored, .downMirrored: transform = transform.translatedBy(x: self.size.width, y: 0) transform = transform.scaledBy(x: -1, y: 1) break case .leftMirrored, .rightMirrored: transform = transform.translatedBy(x: self.size.height, y: 0); transform = transform.scaledBy(x: -1, y: 1) break default: break } let ctx = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height), bitsPerComponent: self.cgImage!.bitsPerComponent, bytesPerRow: 0, space: self.cgImage!.colorSpace!, bitmapInfo: self.cgImage!.bitmapInfo.rawValue) ctx?.concatenate(transform) switch self.imageOrientation { case .left, .leftMirrored, .right, .rightMirrored: ctx?.draw(self.cgImage!, in: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(size.height), height: CGFloat(size.width))) break default: ctx?.draw(self.cgImage!, in: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(size.width), height: CGFloat(size.height))) break } let cgimg: CGImage = (ctx?.makeImage())! let img = UIImage(cgImage: cgimg) return img } //將圖⽚裁剪成指定⽐例(多余部分⾃動刪除) func crop(ratio: CGFloat) -> UIImage { //計算最終尺⼨ var newSize:CGSize! if size.width/size.height > ratio { newSize = CGSize(width: size.height * ratio, height: size.height) }else{ newSize = CGSize(width: size.width, height: size.width / ratio) } ////圖⽚繪制區域 var rect = CGRect.zero rect.size.width = size.width rect.size.height = size.height rect.origin.x = (newSize.width - size.width ) / 2.0 rect.origin.y = (newSize.height - size.height ) / 2.0 //繪制並獲取最終圖⽚ UIGraphicsBeginImageContext(newSize) draw(in: rect) let scaledImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return scaledImage! } //壓縮圖⽚寬⾼ func scaleToSize(size:CGSize) -> UIImage{ UIGraphicsBeginImageContext(size) self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) let scaledImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return scaledImage! } } // 相機相關擴展類⽅法 import UIKit import Photos /// 相⽚選擇器類型:相冊 PhotoLibrary,圖庫 SavedPhotosAlbum,相機Camera,前置攝像頭 Front,后置攝像頭 Rear public enum UIImagePickerType:Int { /// 相冊 PhotoLibrary case UIImagePickerTypePhotoLibrary = 1 /// 圖庫 SavedPhotosAlbum case UIImagePickerTypeSavedPhotosAlbum = 2 /// 相機 Camera case UIImagePickerTypeCamera = 3 /// 前置攝像頭 Front case UIImagePickerTypeCameraFront = 4 /// 后置攝像頭 Rear case UIImagePickerTypeCameraRear = 5 } extension UIImagePickerController { // MARK: - 設備使⽤有效性判斷 // 相冊 PhotoLibrary,圖庫 SavedPhotosAlbum,相機 Camera,前置攝像頭Front,后置攝像頭 Rear public class func isValidImagePickerType(type imagePickerType:UIImagePickerType) -> Bool { switch imagePickerType { case .UIImagePickerTypePhotoLibrary: if self.isValidPhotoLibrary { return true } return false case .UIImagePickerTypeSavedPhotosAlbum: if self.isValidSavedPhotosAlbum { return true } return false case .UIImagePickerTypeCamera: if self.isValidCameraEnable && self.isValidCamera { return true } return false case .UIImagePickerTypeCameraFront: if self.isValidCameraEnable && self.isValidCameraFront { return true } return false case .UIImagePickerTypeCameraRear: if self.isValidCamera && self.isValidCameraRear { return true } return false } } /// 相機設備是否啟⽤ public class var isValidCameraEnable:Bool{ get { let cameraStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.audio) if cameraStatus == AVAuthorizationStatus.denied { return false } return true } } /// 相機Camera是否可⽤(是否有攝像頭) public class var isValidCamera:Bool{ get { if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.Sourc eType.camera){ return true } return false } } /// 前置相機是否可⽤ public class var isValidCameraFront:Bool{ get { if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerController.Ca meraDevice.front){ return true } return false } } /// 后置相機是否可⽤ public class var isValidCameraRear:Bool{ get { if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerController.Ca meraDevice.rear){ return true } return false } } /// 相冊PhotoLibrary是否可⽤ public class var isValidPhotoLibrary:Bool{ get { if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.Sourc eType.photoLibrary) { return true } return false } } /// 圖庫SavedPhotosAlbum是否可⽤ public class var isValidSavedPhotosAlbum:Bool { get { if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.Sourc eType.savedPhotosAlbum) { return true } return false } } // MARK: - 屬性設置 func setImagePickerStyle(bgroundColor:UIColor?, titleColor:UIColor?, buttonTitleColor:UIColor?) { // 改navigationBar背景⾊ if let bgroundColor:UIColor = bgroundColor { self.navigationBar.barTintColor = bgroundColor } // 改navigationBar標題⾊ if let titleColor:UIColor = titleColor { self.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor] } // 改navigationBar的button字體⾊ if let buttonTitleColor:UIColor = buttonTitleColor { self.navigationBar.tintColor = buttonTitleColor } } }
//拿到圖片后我們使用ALamofire上傳
//url 上傳url地址 //image 需要上傳的uiimage //execute 回調函數 func upload(_ url:String,image:UIImage,execute:@escaping (Int,JSON) -> Void){ let headers:HTTPHeaders = [ "headerkey": "headerVal", ] //Alamofire.upload(image.jpegData(compressionQuality: 0.5)!, to: url) Alamofire.upload(multipartFormData: {(data) in data.append(image.jpegData(compressionQuality: 0.6)!, withName: "file",fileName: "\(Date().timeIntervalSince1970).jpg",mimeType: "image/jpeg") },to: url as URLConvertible,method: .post,headers: headers, encodingCompletion: {(result) in switch result{ case .success(let upload,_,_): upload.responseJSON{response in guard let result = response.result.value else { return } print("json:\(result)") let json = JSON(result) execute(json["code"].intValue,,nil) } break case .failure(let err): print(err) execute(-1,nil) break } print(result) }) }