iOS) 이미지 리사이징

1 minute read

내용

  • 서버에서 270*270, 360*360, 720*720 으로 리사이징된 이미지를 URL 을 가공해서 가져오기
  • 서버로 720*720 이하는 원본, 초과는 720*720 으로 리사이징해서 업로드하기

서버에서 270*270, 720*720 으로 리사이징된 이미지를 URL 을 가공해서 가져오기

  • Kingfisher 를 사용해서 UIImageView 를 extension 해서 사용
import UIKit

import Kingfisher

@frozen
enum ResizingImagetype {
    case small
    case medium
    case large
}

extension UIImageView {
    /// URL 주소를 가지고 이미지 다운로드.
    ///
    /// type: 리사이징된 이미지를 설정할 수 있음.
    /// - small - 270*270
    /// - medium - 360*360
    /// - large - 720*720
    @discardableResult
    func updateImage(_ imagePath: String, type: ResizingImagetype = .small) -> Bool {
// ✅ find period index.
        guard let periodIndex = imagePath.lastIndex(of: ".") else {
            self.image = UIImage()
            return false
        }

        // https://xxx.xxx.xxx
        let imageURL = imagePath[imagePath.startIndex..<periodIndex]
        // .png?alt=media or .jpeg?alt=media
        let imageType = imagePath[periodIndex..<imagePath.endIndex]

        // https://xxx.xxx.xxx_270x270.png?alt=media
        let resizingURL: String
        switch type {
        case .small:
            resizingURL = imageURL + "_270x270" + imageType
        case .medium:
            resizingURL = imageURL + "_360x360" + imageType
        case .large:
            resizingURL = imageURL + "_720x720" + imageType
        }

        guard let url = URL(string: resizingURL) else {
            self.image = UIImage()
            return false
        }

// ✅ use Kingfisher to set image.
        self.kf.indicatorType = .none
        self.kf.setImage(
            with: url,
            placeholder: UIImage(named: "placeholder"),
            options: [
                .scaleFactor(UIScreen.main.scale),
                .transition(.fade(0.3)),
                .cacheOriginalImage
            ]) { result in
            switch result {
            case .success:
                return
            case .failure(let error):
                print("kingfisher work failed: \(error.localizedDescription)")
            }
        }
        return true
    }
}

서버로 720 이하는 원본, 초과는 720 으로 리사이징하기

extension UIImage {
     /// 이미지의 용량을 줄이기 위해서 리사이즈.
     /// - 가로, 세로 중 짧은 것이 720 보다 작다면 그대로 반환.
     /// - 가로, 세로 중 짧은 것이 720 보다 크다면 720 으로 리사이즈해서 반환.
     func resize() -> UIImage {
         let width = self.size.width
         let height = self.size.height
         let resizeLength: CGFloat = 720.0

         var scale: CGFloat

         if height >= width {
             scale = width <= resizeLength ? 1 : resizeLength / width
         } else {
             scale = height <= resizeLength ? 1 :resizeLength / height
         }

         let newHeight = height * scale
         let newWidth = width * scale
         let size = CGSize(width: newWidth, height: newHeight)
         let render = UIGraphicsImageRenderer(size: size)
         let renderImage = render.image { _ in
             self.draw(in: CGRect(origin: .zero, size: size))
         }
         return renderImage
     }
 }

참고:

[Swift] Image Resize

[iOS] 이미지 리사이징을 활용한 메모리 최적화

Categories:

Updated: