본문 바로가기
iOS_Swift 앱개발👍

[iOS_Swift] UIImagePickerController 촬영 후 이미지 하나로 만들기_ 46

by 개발하는윤기사 2024. 5. 2.
728x90
반응형

 

안녕하세요~ 개발하는 윤기사입니다!!

 

오랜만에 포스팅을 남기게 되었네요. 

 

이번 포스팅은 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단계를 거치면 아래와 같은 결과물을 얻을 수 있어요!! 

 

 

촬영한 사진 + TimeStamp + DateStamp + LogoImage

 

 

 

 

참고 : 

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

 

728x90
반응형