안녕하세요~ 개발하는 윤기사입니다!!
오랜만에 포스팅을 남기게 되었네요.
이번 포스팅은 UIImagePickerController를 이용해 사진 촬영 후!
촬영된 UIImage에 원하는 Text와 Image를 넣어서 하나의 UIImage로 만들 겁니다!
바로 시작해 보시죠 ~!
1. UIImagePickerController 설정하기
- UIImagePickerController 초기화를 해줍니다!
let imagePicker = UIImagePickerController()
- viewDidLoad에 imagePicker.delegate = self 선언을 해주고요!
imagePicker.delegate = self
- 카메라에 대한 권한을 확인 후 허용이 되어있을 때만 UIImagePicker를 present 해주면 됩니다.
AVCaptureDevice.requestAccess(for: .video) { [weak self] success in
guard let self else { return }
if success {
if UIImagePickerController.isSourceTypeAvailable(.camera) {
DispatchQueue.main.async(qos: .background) {
self.imagePicker.sourceType = .camera
self.present(self.imagePicker, animated: true)
}
} else {
print("Camera not available")
}
} else {
//설정으로 이동
}
}
2. TimeStamp, DateStamp를 표시하기 위한 메서드
* TimeStamp의 en_US_POSIX : 사용자 디바이스 표기 시간 설정값에 상관없이 "PM 04:03" 형식으로 표기하기 위함이에요!!
func getCurrentTimeStamp() -> String {
let formatter = DateFormatter()
formatter.dateFormat = "a hh:mm"
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter.string(from: Date())
}
func getCurrentDateStamp() -> String {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy.MM.dd"
return formatter.string(from: Date())
}
3. UIImage, Text, LogoImage를 결합하기 위한 메서드
- TimeStamp와 DateStamp, LogoImage를 어디에 위치시킬지 정합니다.
- NSAttributedString를 이용해서 font 설정도 해줍니다.
- draw(in:_)을 이용해서 Image와 Label을 원하는 위치에 그려줍니다.
func combineImagesAndTexts(timeStampLbl: String, dateStampLbl: String, captureImage: UIImage, logoImage: UIImage) -> UIImage? {
let size = CGSize(width: DEVICE_WIDTH(), height: DEVICE_WIDTH() * 1.25)
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
captureImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
logoImage.draw(in: CGRect(x: size.width - 128, y: 20, width: 108, height: 14))
let timeTextAttributes: [NSAttributedString.Key: Any] = [
.font: KYOBO_BOLD(30),
.foregroundColor: UIColor.white,
.kern: -1.8
]
let dateTextAttributes: [NSAttributedString.Key: Any] = [
.font: KYOBO_REGULAR(16),
.foregroundColor: UIColor.white,
.kern: -0.96
]
let text1Rect = CGRect(x: 30, y: size.height - 83, width: 140, height: 33)
timeStampLbl.draw(in: text1Rect, withAttributes: timeTextAttributes)
let text2Rect = CGRect(x: 30, y: size.height - 46, width: 125, height: 22)
dateStampLbl.draw(in: text2Rect, withAttributes: dateTextAttributes)
let combinedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return combinedImage
}
4. 사진 촬영 후 동작 처리
* imagePickerController(didFinishPickingMediaWithInfo:_) : UIImagePickerController 사진 촬영 완료 후 동작
- catpturedImage = info[.originalImage] : 촬영된 이미지
- timeStampText : 현재 시간 Label
- dateStampText : 현재 날짜 Label
- logoImage : 원하는 UIImage
* imagePickerControllerDidCancel : 카메라 Cancel 버튼 클릭 시 동작
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
dismiss(animated: false, completion: nil)
if let capturedImage = info[.originalImage] as? UIImage {
let timeStampText = self.getCurrentTimeStamp()
let dateStampText = self.getCurrentDateStamp()
let logoImage = UIImage(named: "customLogo")!
let combinedImage = self.combineImagesAndTexts(timeStampLbl: timeStampText, dateStampLbl: dateStampText, captureImage: capturedImage, logoImage: logoImage)
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: false, completion: nil)
}
위 4단계를 거치면 아래와 같은 결과물을 얻을 수 있어요!!
참고 :
https://developer.apple.com/documentation/uikit/uiimagepickercontroller
UIImagePickerController | Apple Developer Documentation
A view controller that manages the system interfaces for taking pictures, recording movies, and choosing items from the user’s media library.
developer.apple.com
'iOS_Swift 앱개발👍' 카테고리의 다른 글
[iOS_Swift] HealthKit - 헬스킷 : 운동 데이터 (With HKWorkout)_ 45 (0) | 2024.01.12 |
---|---|
[iOS_Swift] VIPER 디자인 패턴 _ 44 (2) | 2023.12.27 |
[iOS_Swift] Fastlane + Jenkins을 이용해 CI/CD를 구축해보자 - 2_43 (0) | 2023.12.20 |
[iOS_Swift] Fastlane을 이용해 CI/CD를 구축해보자 - 1_42 (2) | 2023.11.22 |
[iOS_Swift] HealthKit - 헬스킷 : 수면 데이터 마스터 (With HKCategoryType)_ 41 (1) | 2023.11.13 |