iOS) 이미지 리사이징
내용
- 서버에서
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
}
}
참고: