CustomCameraViewController.swift 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. //
  2. // CustomCameraViewController.swift
  3. // MCPlus
  4. //
  5. // Created by seo ha on 31/01/2019.
  6. // Copyright © 2019 KangSH. All rights reserved.
  7. //
  8. import UIKit
  9. import AVFoundation
  10. import ReactiveCocoa
  11. import ReactiveSwift
  12. class CustomCameraViewController: UIViewController {
  13. @IBOutlet weak var patientIdLabel :UILabel!{
  14. didSet{
  15. patientIdLabel.reactive.text <~ PictureViewController.patientId
  16. }
  17. }
  18. @IBOutlet weak var patientNmLabel :UILabel!{
  19. didSet{
  20. patientNmLabel.reactive.text <~ PictureViewController.patientNm
  21. }
  22. }
  23. @IBOutlet weak var ageGenderLabel :UILabel!{
  24. didSet{
  25. ageGenderLabel.reactive.text <~ PictureViewController.ageGender
  26. }
  27. }
  28. @IBOutlet weak var previewView: UIView!
  29. @IBOutlet weak var takePhoto: UIButton!{
  30. didSet{
  31. takePhoto.addTapGestureRecognizer(action: self.takeAction)
  32. }
  33. }
  34. @IBOutlet weak var finishButton: UIButton!{
  35. didSet{
  36. finishButton.addTapGestureRecognizer(action: self.finish)
  37. }
  38. }
  39. @IBOutlet weak var albumButton: UIButton!{
  40. didSet{
  41. albumButton.addTapGestureRecognizer(action: self.albumAction)
  42. }
  43. }
  44. var session: AVCaptureSession?
  45. var stillImageOutput:AVCaptureOutput{
  46. if #available(iOS 11.0, *) {
  47. return AVCapturePhotoOutput()
  48. } else {
  49. let stillImageOutput = AVCaptureStillImageOutput()
  50. stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
  51. return stillImageOutput
  52. }
  53. }
  54. // var stillImageOutput: AVCaptureStillImageOutput?
  55. // var stillImageOutput: AVCapturePhotoOutput?
  56. var videoPreviewLayer: AVCaptureVideoPreviewLayer?
  57. static var photoProcessCommit = MutableProperty<Photo?>(nil)
  58. }
  59. extension CustomCameraViewController{
  60. override func viewDidLoad() {
  61. super.viewDidLoad()
  62. session = AVCaptureSession()
  63. session!.sessionPreset = AVCaptureSession.Preset.photo
  64. let backCamera = AVCaptureDevice.default(for: AVMediaType.video)
  65. var error: NSError?
  66. var input: AVCaptureDeviceInput!
  67. do {
  68. if let camera = backCamera{
  69. input = try AVCaptureDeviceInput(device: camera)
  70. }
  71. } catch let error1 as NSError {
  72. error = error1
  73. input = nil
  74. print(error!.localizedDescription)
  75. }
  76. if error == nil && session!.canAddInput(input) {
  77. session!.addInput(input)
  78. if session!.canAddOutput(stillImageOutput) {
  79. session!.addOutput(stillImageOutput)
  80. videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session!)
  81. videoPreviewLayer!.videoGravity = AVLayerVideoGravity.resizeAspect
  82. videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
  83. previewView.layer.addSublayer(videoPreviewLayer!)
  84. if let size = previewView?.bounds.size{
  85. videoPreviewLayer?.frame.size = size
  86. }
  87. videoPreviewLayer?.videoGravity = .resizeAspectFill
  88. session!.startRunning()
  89. }
  90. }
  91. }
  92. override func viewDidAppear(_ animated: Bool) {
  93. super.viewDidAppear(animated)
  94. videoPreviewLayer!.frame = previewView.bounds
  95. }
  96. func finish(){
  97. self.navigationController?.popViewController(animated: true)
  98. }
  99. func albumAction(){
  100. if let parent = self.parent as? PictureViewController{
  101. parent.gallaryAction(action: nil)
  102. }
  103. }
  104. func takeAction(){
  105. if #available(iOS 11.0, *) {
  106. let settings = AVCapturePhotoSettings()
  107. settings.livePhotoVideoCodecType = .jpeg
  108. guard let `stillImageOutput` = stillImageOutput as? AVCapturePhotoOutput else{ return }
  109. stillImageOutput.capturePhoto(with: settings, delegate: self)
  110. }else{
  111. guard let connection = stillImageOutput.connection(with: AVMediaType.video) else {
  112. return
  113. }
  114. guard let `stillImageOutput` = stillImageOutput as? AVCaptureStillImageOutput else {
  115. return
  116. }
  117. stillImageOutput.captureStillImageAsynchronously(from: connection, completionHandler: { [weak self](buffer, error) in
  118. if let _ = error{
  119. return
  120. }
  121. guard let buffer = buffer else{
  122. return
  123. }
  124. if let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer){
  125. let image = UIImage(data: imageData)
  126. self?.processingImage(image: image)
  127. }
  128. })
  129. }
  130. }
  131. func processingImage(image:UIImage?){
  132. if let image = image{
  133. DispatchQueue(label: "background").async{ [weak self] in
  134. guard let `self` = self else{ return }
  135. let datas = [image]
  136. .map(self.resizableTaransform)
  137. .map(self.optimisingTransform)
  138. //도큐먼트의 유저 디렉토리를 찾는다
  139. if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
  140. let path = dir.appendingPathComponent("kunkuk")
  141. //해당 폴더가 없으면 생성
  142. if !FileManager.default.fileExists(atPath: path.path){
  143. try? FileManager.default.createDirectory(at: path, withIntermediateDirectories: true, attributes: nil)
  144. }
  145. let thumb = dir.appendingPathComponent("thumb")
  146. //해당 폴더가 없으면 생성
  147. if !FileManager.default.fileExists(atPath: thumb.path){
  148. try? FileManager.default.createDirectory(at: thumb, withIntermediateDirectories: true, attributes: nil)
  149. }
  150. //각 데이터 저장
  151. for data in datas{
  152. let date = Date()
  153. let file = "kunkuk_\(date.fromString(format: "yyyyMMddhhmmss")).jpg"
  154. let fileURL = path.appendingPathComponent(String(file))
  155. let thumbURL = thumb.appendingPathComponent(String(file))
  156. try? data?.write(to: fileURL)
  157. let origin = UIImage(data: data!)
  158. try? self.getThumbnailData(image: origin!)?.write(to: thumbURL)
  159. do {
  160. guard let parent = self.parent as? PictureViewController else{ return }
  161. let date = Date().fromString(format: "yyyy-MM-dd")
  162. let name = parent.user?.patientNm ?? ""
  163. var treatCls = ""
  164. let deptNm = parent.user?.deptNm ?? ""
  165. switch parent.user?.treatCls{
  166. //외래
  167. case "O"?:
  168. treatCls = "외래"
  169. //입원
  170. case "I"?:
  171. treatCls = "입원"
  172. //응급
  173. case "E"?:
  174. treatCls = "응급"
  175. default:
  176. break
  177. }
  178. let photo = Photo()
  179. photo.user = parent.user
  180. photo.file = file
  181. photo.date = date
  182. photo.key = "\(date) \(name) \(treatCls), \(deptNm)"
  183. photo.isSended = false
  184. photo.save()
  185. //노티피케이션 알림
  186. CustomCameraViewController.photoProcessCommit.value = photo
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. func resizableTaransform(image:UIImage) -> UIImage {
  194. let width = image.size.width
  195. let height = image.size.height
  196. var ratio:CGFloat = 1.0
  197. if width > 640{
  198. ratio = width / 640
  199. }
  200. return image.scaleToSize(newSize: CGSize(width: width / ratio, height: height / ratio))
  201. }
  202. func optimisingTransform(image:UIImage) -> Data? {
  203. return image.jpegData(compressionQuality: 0.7)
  204. }
  205. func getThumbnailData(image:UIImage) -> Data? {
  206. let datas = [image]
  207. .map(resizableTaransform)
  208. .map(optimisingTransform)
  209. return datas.first!
  210. }
  211. }
  212. extension CustomCameraViewController: AVCapturePhotoCaptureDelegate{
  213. @available(iOS 11.0, *)
  214. func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
  215. guard error == nil else{ return }
  216. guard let imageData = photo.fileDataRepresentation() else{ return }
  217. let image = UIImage(data: imageData)
  218. self.processingImage(image: image)
  219. }
  220. }