본문 바로가기

iOS

이미지 리사이징으로, 저장용량 줄이기

QR코드와 같은 정보를 저장하기 위해, 이미지를 편집하고 저장하는 기능을 개발하고 있었습니다.

단순하게 이미지를 지정된 구간만큼 자르고 저장을 하던 중, 이미지의 용량이 필요 이상으로 저장되고 있음을 확인했습니다.

사용자의 핸드폰에 저장공간을 필요 이상으로 사용하여, 앱 제거 대상이 되기 전 이미지 용량을 줄이기로 했습니다.

최적화 전 - 이미지를 자른 그대로 사용하기

let cropped = 
  UIImage(cgImage: (이미지 크롭))
)

최적화 후 - 자른 이미지를 QR 코드를 인식할 수 있거나, 정보를 분간하는데 문제가 없는 수준으로 줄이기

func getImageFileSize(image: UIImage) -> Int? {
	guard let imageData = image.jpegData(compressionQuality: 1) else {
		return nil
	}
	return imageData.count
}

이미지의 사이즈를 측정하는 코드입니다.

 

 

static func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
    let size = image.size
    
    let widthRatio = targetSize.width / size.width
    let heightRatio = targetSize.height / size.height
    
    var newSize: CGSize
    
    if widthRatio > heightRatio {
      newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
    } else {
      newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
    }
    
    let rect = CGRect(origin: .zero, size: newSize)
    
    UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return newImage!
}

1. 원본 이미지의 크기와 목표 크기의 비율을 계산하고,  widthRatio와 heightRatio 중 어느 것이 더 큰지 비교하여 원본 이미지의 종횡비를 유지하면서 새 크기를 계산합니다.

2. 새 크기, opaque 속성 (투명도 지원 여부), scale 속성 (디바이스 픽셀 밀도와 일치 여부)을 사용하여 그래픽 컨텍스트를 생성합니다.

3. 원본 이미지를 새 그래픽 컨텍스트에 원하는 크기로 그린 후, 리사이즈된 이미지를 반환합니다.

 

 

let cropped = UIImage(
      cgImage: (
        cgImage.cropping(to:
	  CGRect(
                x: cgImage.width/2 - width/2,
                y: y,
                width: width,
                height: height))
	)!
)

print(getImageFileSize(image: cropped))
let resizedImage = UIImage.resizeImage(image: cropped, targetSize: CGSize(width: 240, height: 240))
print(getImageFileSize(image: resizedImage))

# Optional(1054866)
# Optional(139106)

resizeImage 함수를 활용해 이미지를 필요한 크기로 줄였고,

결과적으로, 이미지 저장 용량을 86.8%를 줄일 수 있었습니다.