【Swift】画像を圧縮して容量を減らす
どうも、ねこきち(@nekokichi1_yos2)です。
Realmに画像を保存しようとした時、データ容量が大きすぎる、とのエラーに遭遇しました。
そこで、画像を圧縮すると、無事にRealmへ保存できました。
今回は、備忘録として画像の圧縮方法、を書きます。
結果
下記のコードで、画像を圧縮する前と10%に圧縮した後のデータサイズを確認すると、 10分の1以下に圧縮されてます。
let pickerImageData:Int = NSData(data: pickerImage.jpegData(compressionQuality: 1)!).count let resizedImageData:Int = NSData(data: resizedImage.jpegData(compressionQuality: 1)!).count print(Double(pickerImageData) / 1000.0) print(Double(resizedImageData) / 1000.0)
ソースコード
import UIKit class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! let imagePicker = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() imagePicker.delegate = self imagePicker.sourceType = .photoLibrary } @IBAction func button(_ sender: Any) { present(imagePicker, animated: true, completion: nil) } } extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let pickerImage = info[.originalImage] as? UIImage { // 10%に圧縮した画像 let resizedImage = pickerImage.resizeImage(withPercentage: 0.1)! // imageViewに挿入 imageView.image = resizedImage } dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { dismiss(animated: true, completion: nil) } } extension UIImage { // percentage:圧縮率 func resizeImage(withPercentage percentage: CGFloat) -> UIImage? { // 圧縮後のサイズ情報 let canvas = CGSize(width: size.width * percentage, height: size.height * percentage) // 圧縮画像を返す return UIGraphicsImageRenderer(size: canvas, format: imageRendererFormat).image { _ in draw(in: CGRect(origin: .zero, size: canvas)) } } }
参考